Intereting Posts

Как получить доступ к константам класса в Twig?

У меня есть несколько констант класса в моем классе сущности, например:

class Entity { const TYPE_PERSON = 0; const TYPE_COMPANY = 1; } 

В обычном PHP я часто делаю if($var == Entity::TYPE_PERSON) и я хотел бы делать подобные вещи в Twig. Является ли это возможным?

 {% if var == constant('Entity::TYPE_PERSON') %} {# or #} {% if var is constant('Entity::TYPE_PERSON') %} 

См. Документацию по constant функции и constant тесту .

Просто чтобы сэкономить ваше время. Если вам нужно получить доступ к константам класса в пространстве имен, используйте

 {{ constant('Acme\\DemoBundle\\Entity\\Demo::MY_CONSTANT') }} 

Начиная с 1.12.1 вы также можете читать константы из экземпляров объекта:

 {% if var == constant('TYPE_PERSON', entity) 

Изменить: я нашел лучшее решение, прочитал об этом здесь.


  • Подробнее о том, как создавать и регистрировать расширение в документации Twig.
  • Читайте о расширениях Twig в документации Symfony2.

Допустим, у вас есть класс:

 namespace MyNamespace; class MyClass { const MY_CONSTANT = 'my_constant'; const MY_CONSTANT2 = 'const2'; } 

Создайте и зарегистрируйте расширение 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 ); } } 

Теперь вы можете использовать константы в Twig, например:

 {{ MyClass.MY_CONSTANT }} 

Если вы используете пространства имен

 {{ constant('Namespace\\Entity::TYPE_COMPANY') }} 

Важный! Используйте двойные косые черты вместо одиночных

В книге лучших практик Symfony есть раздел с этой проблемой:

Константы могут использоваться, например, в ваших шаблонах Twig благодаря функции constant ():

 // src/AppBundle/Entity/Post.php namespace AppBundle\Entity; class Post { const NUM_ITEMS = 10; // ... } 

И используйте эту константу в шаблоне:

 <p> Displaying the {{ constant('NUM_ITEMS', post) }} most recent results. </p> 

Здесь ссылка: http://symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options

Через несколько лет я понял, что мой предыдущий ответ на самом деле не так хорош. Я создал расширение, которое лучше решает проблему. Он опубликован как открытый источник.

https://github.com/dpolac/twig-const

Он определяет новый оператор Twig # который позволяет вам получить доступ к константе класса через любой объект этого класса.

Используйте его так:

{% if entity.type == entity#TYPE_PERSON %}