Twig: фильтровать в условии if

Я хочу использовать фильтр в условии 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 теперь существует и имеет значение, с которым я ее сравниваю. Что я делаю не так?


person bekay    schedule 07.03.2013    source источник
comment
У вас слишком много логики во View, я бы перенес логику в контроллеры. Сделайте представление простым, его также намного проще тестировать.   -  person Peter Wooster    schedule 08.03.2013
comment
Я не вижу смысла всегда присваивать шаблону одно и то же значение в каждом действии контроллера, когда я могу иметь одно логическое выражение в самом представлении. Это просто заканчивается подверженными ошибкам повторениями...   -  person bekay    schedule 08.03.2013
comment
Это должно работать... Вы уверены, что не используете кеш на своей странице?   -  person Sybio    schedule 08.03.2013
comment
Я работаю в среде разработки. Кэширования здесь нет. Это действительно странно, потому что отфильтрованное выражение всегда печатает правильное значение, но в теге оператора, например, if, похоже, это не работает...   -  person bekay    schedule 08.03.2013
comment
Представление не должно быть так тесно связано с контроллерами, сравнение должно производиться по значению, установленному контроллером, которое описывает что-то, представляющее интерес для представления.   -  person Peter Wooster    schedule 08.03.2013
comment
Я здесь не для того, чтобы обсуждать с вами шаблоны проектирования программного обеспечения — я задал вопрос о технических возможностях twig...   -  person bekay    schedule 08.03.2013


Ответы (1)


Хорошо, я проверил это, у 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 %}
person Sybio    schedule 07.03.2013
comment
Просто хочу добавить, что в twig встроен dump(), вот как его включить в Symfony. - person Maerlyn; 09.03.2013