Я хочу использовать фильтр в условии if в Twig. Причиной этого является атрибут Symfony2, который я не могу сравнивать напрямую, я должен изменить его заранее. Я начал с этого кода:
{% if app.request.attributes.get('_controller')|split('::')|first == 'some\controller\name' %}
do something
{% endif %}
К сожалению, это не работает. Поэтому я подумал, что буду использовать set перед сравнением:
{% set controller = app.request.attributes.get('_controller')|split('::')|first %}
{% if controller == 'some\controller\name' %}
do something
{% endif %}
{{ controller }} {# would print 'some\controller\name' #}
Угадай, что? "сделать что-нибудь" не печатается, даже если переменная controller теперь существует и имеет значение, с которым я ее сравниваю. Что я делаю не так?
Ответ 1 · рейтинг 3 · Sybio
Хорошо, я проверил это, у Twig есть странное поведение. "\" экранирован или что-то в этом роде. Я расширил свою ветку с помощью функции var_dump, проверьте это:
{{ var_dump("Sybio\Bundle\WebsiteBundle\Controller\MainController") }}
//string(48) "SybioBundleWebsiteBundleControllerMainController"
{{ var_dump(app.request.attributes.get('_controller')|split('::')|first) }}
// string(52) "Sybio\Bundle\WebsiteBundle\Controller\MainController"
{{ var_dump("Sybio\\Bundle\\WebsiteBundle\\Controller\\MainController") }}
// string(52) "Sybio\Bundle\WebsiteBundle\Controller\MainController"
Вот почему ваш тест всегда ложный. Вам нужно удвоить обратную косую черту сравниваемой строки...
{% if app.request.attributes.get('_controller')|split('::')|first == 'some\\controller\\name' %}
do something
{% endif %}