Как получить доступ к константам класса в Twig? - PullRequest
121 голосов
/ 30 сентября 2011

В моем классе сущностей есть несколько констант класса, например ::1001

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

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

Ответы [ 7 ]

227 голосов
/ 20 октября 2012

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

{{ constant('Acme\\DemoBundle\\Entity\\Demo::MY_CONSTANT') }}
171 голосов
/ 30 сентября 2011
{% if var == constant('Namespace\\Entity::TYPE_PERSON') %}
{# or #}
{% if var is constant('Namespace\\Entity::TYPE_PERSON') %}

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

24 голосов
/ 26 марта 2014

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

{% if var == constant('TYPE_PERSON', entity)
10 голосов
/ 24 сентября 2014

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



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

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 }}
10 голосов
/ 21 апреля 2014

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

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

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

8 голосов
/ 03 декабря 2014

В книге лучших практик 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

4 голосов
/ 28 мая 2016

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...