У меня есть несколько констант класса в моем классе сущности, например:
class Entity {
const TYPE_PERSON = 0;
const TYPE_COMPANY = 1;
}
В обычном PHP я часто делаю if($var == Entity::TYPE_PERSON)
, и я хотел бы делать подобные вещи в Twig. Возможно ли это?
Ответ 1
{% if var == constant('Entity::TYPE_PERSON') %}
{# or #}
{% if var is constant('Entity::TYPE_PERSON') %}
См. документацию для функции constant
и constant
test.
Ответ 2
Просто чтобы сэкономить ваше время. Если вам нужно получить доступ к константам класса в пространстве имен, используйте
{{ constant('Acme\\DemoBundle\\Entity\\Demo::MY_CONSTANT') }}
Ответ 3
Начиная с 1.12.1 вы также можете читать константы из экземпляров объекта:
{% if var == constant('TYPE_PERSON', entity)
Ответ 4
Изменить: я нашел лучшее решение, прочитал об этом здесь.
Скажем, у вас есть класс:
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 }}
Ответ 5
Если вы используете пространства имен
{{ constant('Namespace\\Entity::TYPE_COMPANY') }}
Внимание! Используйте двойные косые черты вместо одиночного
Ответ 6
В книге лучших практик 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
Ответ 7
Через несколько лет я понял, что мой предыдущий ответ на самом деле не так хорош. Я создал расширение, которое лучше решает проблему. Он опубликован как открытый источник.
https://github.com/dpolac/twig-const
Он определяет новый оператор Twig #
, который позволяет вам обращаться к константе класса через любой объект этого класса.
Используйте его так:
{% if entity.type == entity#TYPE_PERSON %}