У меня есть несколько констант класса в моем классе сущности, например:
class Entity {
const TYPE_PERSON = 0;
const TYPE_COMPANY = 1;
}
В обычном PHP я часто это делаю, if($var == Entity::TYPE_PERSON)
и мне бы хотелось делать такие вещи в Twig. Является ли это возможным?
{% if var is constant('TYPE_PERSON', object) %}
Просто чтобы сэкономить ваше время. Если вам нужно получить доступ к константам класса в пространстве имен, используйте
источник
{% if var == object.MY_CONSTANT %}
Начиная с 1.12.1, вы также можете читать константы из экземпляров объектов:
источник
{{ constant('Namespace\\Classname::CONSTANT_NAME') }}
( док ){{ constant('TYPE_PERSON', entity) }}
, можно сделать следующее (создать экземпляр класса Entity)$this->render('index.html.twig', ['entity' => new Entity()]);
Изменить: я нашел лучшее решение, читайте об этом здесь.
Допустим, у вас есть класс:
Создать и зарегистрировать расширение Twig:
Теперь вы можете использовать константы в Twig, например:
источник
constant()
с FQN будет утомительным.Если вы используете пространства имен
Важный! Используйте двойную косую черту вместо одиночной
источник
В книге лучших практик Symfony есть раздел с этой проблемой:
И используйте эту константу в шаблоне ветки:
Вот ссылка: 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 %}
источник
User#TYPE_PERSON
, тоNodeExpression
класс может быть изменен на что - то вроде этого, который работал для меня->raw('(constant(\'App\\Entity\\' . $this->getNode('left')->getAttribute('name') . '::' . $this->getNode('right')->getAttribute('name') . '\'))')
. Конечно, это ограничивает ваши классыApp\Entity
пространством имен, но я думаю, что это наиболее распространенный вариант использования.