Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: bekayОтветов: 1

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

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

symfonytwig

Ответы

Ответ 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 %}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы