J'ai quelques constantes de classe dans ma classe d'entité, par exemple:
class Entity {
const TYPE_PERSON = 0;
const TYPE_COMPANY = 1;
}
En PHP normal, je fais souvent if($var == Entity::TYPE_PERSON)
et j'aimerais faire ce genre de choses dans Twig. C'est possible?
{% if var is constant('TYPE_PERSON', object) %}
Juste pour gagner du temps. Si vous avez besoin d'accéder aux constantes de classe sous l'espace de noms, utilisez
la source
{% if var == object.MY_CONSTANT %}
Depuis la version 1.12.1, vous pouvez également lire les constantes des instances d'objet:
la source
{{ constant('Namespace\\Classname::CONSTANT_NAME') }}
( doc ){{ constant('TYPE_PERSON', entity) }}
, il est possible de faire ce qui suit (instancier la classe Entity)$this->render('index.html.twig', ['entity' => new Entity()]);
Edit: j'ai trouvé une meilleure solution, lisez-la ici.
Disons que vous avez la classe:
Créez et enregistrez l'extension Twig:
Vous pouvez maintenant utiliser des constantes dans Twig comme:
la source
constant()
avec FQN serait gênant.Si vous utilisez des espaces de noms
Important! Utilisez des doubles barres obliques au lieu de simples
la source
Dans les bonnes pratiques de Symfony, il y a une section avec ce problème:
Et utilisez cette constante dans le template twig:
Voici le lien: http://symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options
la source
Après quelques années, j'ai réalisé que ma réponse précédente n'était pas vraiment très bonne. J'ai créé une extension qui résout mieux le problème. Il est publié en open source.
https://github.com/dpolac/twig-const
Il définit un nouvel opérateur Twig
#
qui vous permet d'accéder à la constante de classe via n'importe quel objet de cette classe.Utilisez-le comme ça:
{% if entity.type == entity#TYPE_PERSON %}
la source
User#TYPE_PERSON
, laNodeExpression
classe pourrait être changé pour quelque chose comme ça, ce qui a fonctionné pour moi:->raw('(constant(\'App\\Entity\\' . $this->getNode('left')->getAttribute('name') . '::' . $this->getNode('right')->getAttribute('name') . '\'))')
. Bien sûr, cela limite vos classes à l'App\Entity
espace de noms, mais je pense que cela couvre le cas d'utilisation le plus courant.