Risposte:
{% if var == constant('Namespace\\Entity::TYPE_PERSON') %}
{# or #}
{% if var is constant('Namespace\\Entity::TYPE_PERSON') %}
Vedere la documentazione per la constant
funzione e il constant
test .
Solo per risparmiare tempo. Se è necessario accedere alle costanti di classe nello spazio dei nomi, utilizzare
{{ constant('Acme\\DemoBundle\\Entity\\Demo::MY_CONSTANT') }}
{% if var == object.MY_CONSTANT %}
A partire da 1.12.1 puoi leggere anche costanti da istanze di oggetti:
{% if var == constant('TYPE_PERSON', entity)
{{ constant('Namespace\\Classname::CONSTANT_NAME') }}
( doc )
{{ constant('TYPE_PERSON', entity) }}
, è possibile fare quanto segue (istanza della classe Entità)$this->render('index.html.twig', ['entity' => new Entity()]);
Modifica: ho trovato una soluzione migliore, leggi qui.
Diciamo che hai lezione:
namespace MyNamespace;
class MyClass
{
const MY_CONSTANT = 'my_constant';
const MY_CONSTANT2 = 'const2';
}
Crea e registra l'estensione Twig:
class MyClassExtension extends \Twig_Extension
{
public function getName()
{
return 'my_class_extension';
}
public function getGlobals()
{
$class = new \ReflectionClass('MyNamespace\MyClass');
$constants = $class->getConstants();
return array(
'MyClass' => $constants
);
}
}
Ora puoi usare le costanti in Twig come:
{{ MyClass.MY_CONSTANT }}
constant()
con FQN sarebbe fastidioso.
Se si utilizzano spazi dei nomi
{{ constant('Namespace\\Entity::TYPE_COMPANY') }}
Importante! Usa doppie barre anziché singole
Nelle best practice del libro di Symfony c'è una sezione con questo problema:
Le costanti possono essere utilizzate ad esempio nei modelli di Twig grazie alla funzione constant ():
// src/AppBundle/Entity/Post.php
namespace AppBundle\Entity;
class Post
{
const NUM_ITEMS = 10;
// ...
}
E usa questa costante nel ramoscello del modello:
<p>
Displaying the {{ constant('NUM_ITEMS', post) }} most recent results.
</p>
Qui il link: http://symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options
Dopo alcuni anni mi sono reso conto che la mia risposta precedente non è poi così buona. Ho creato un'estensione che risolve meglio il problema. È pubblicato come open source.
https://github.com/dpolac/twig-const
Definisce il nuovo operatore Twig #
che consente di accedere alla costante di classe attraverso qualsiasi oggetto di quella classe.
Usalo così:
{% if entity.type == entity#TYPE_PERSON %}
User#TYPE_PERSON
, la NodeExpression
classe potrebbe essere cambiato in qualcosa di simile, che ha funzionato per me: ->raw('(constant(\'App\\Entity\\' . $this->getNode('left')->getAttribute('name') . '::' . $this->getNode('right')->getAttribute('name') . '\'))')
. Naturalmente, questo limita le tue classi allo App\Entity
spazio dei nomi, ma penso che copra il caso d'uso più comune.
{% if var is constant('TYPE_PERSON', object) %}