W mojej klasie encji mam kilka stałych klas, np .:
class Entity {
const TYPE_PERSON = 0;
const TYPE_COMPANY = 1;
}
W zwykłym PHP często robię if($var == Entity::TYPE_PERSON)
i chciałbym robić tego typu rzeczy w Twig. Czy to możliwe?
{% if var == constant('Namespace\\Entity::TYPE_PERSON') %}
{# or #}
{% if var is constant('Namespace\\Entity::TYPE_PERSON') %}
Zobacz dokumentację dotyczącą constant
funkcji i constant
testu .
{% if var is constant('TYPE_PERSON', object) %}
Żeby zaoszczędzić czas. Jeśli potrzebujesz uzyskać dostęp do stałych klas w przestrzeni nazw, użyj
źródło
{% if var == object.MY_CONSTANT %}
Od wersji 1.12.1 można również odczytywać stałe z instancji obiektów:
źródło
{{ constant('Namespace\\Classname::CONSTANT_NAME') }}
( doc ){{ constant('TYPE_PERSON', entity) }}
jest to możliwe do zrobienia następujące (instancję klasy Entity)$this->render('index.html.twig', ['entity' => new Entity()]);
Edycja: znalazłem lepsze rozwiązanie, przeczytaj o tym tutaj.
Powiedzmy, że masz klasę:
Utwórz i zarejestruj rozszerzenie Twig:
Teraz możesz używać stałych w Twig, takich jak:
źródło
constant()
z FQN byłoby uciążliwe.Jeśli używasz przestrzeni nazw
Ważny! Użyj podwójnych ukośników zamiast pojedynczych
źródło
W książce o najlepszych praktykach Symfony znajduje się sekcja z tym problemem:
I użyj tej stałej w gałązce szablonu:
Tutaj link: http://symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options
źródło
Po kilku latach zdałem sobie sprawę, że moja poprzednia odpowiedź nie jest zbyt dobra. Stworzyłem rozszerzenie, które lepiej rozwiązuje problem. Jest opublikowany jako open source.
https://github.com/dpolac/twig-const
Definiuje nowy operator Twig,
#
który umożliwia dostęp do stałej klasy poprzez dowolny obiekt tej klasy.Użyj tego w ten sposób:
{% if entity.type == entity#TYPE_PERSON %}
źródło
User#TYPE_PERSON
TheNodeExpression
klasa może zostać zmieniona na czymś takim, który pracował dla mnie->raw('(constant(\'App\\Entity\\' . $this->getNode('left')->getAttribute('name') . '::' . $this->getNode('right')->getAttribute('name') . '\'))')
. Oczywiście ogranicza to twoje klasy doApp\Entity
przestrzeni nazw, ale myślę, że obejmuje to najbardziej powszechny przypadek użycia.