2013-03-07 7 views
1

Я хочу использовать фильтр в условии if в Twig. Причиной этого является атрибут Symfony2, который я не могу сравнивать напрямую, я должен его заранее изменить. Я начал с этого кода:Twig: фильтр в состоянии if

{% if app.request.attributes.get('_controller')|split('::')|first == 'some\controller\name' %} 
    do something 
{% endif %} 

К сожалению, это не работает. Поэтому я думал, что буду использовать набор перед сравнением:

{% set controller = app.request.attributes.get('_controller')|split('::')|first %} 
{% if controller == 'some\controller\name' %} 
    do something 
{% endif %} 
{{ controller }} {# would print 'some\controller\name' #} 

Угадайте, что? «делать что-то» не печатается, даже если переменная контроллер теперь существует и имеет значение, с которым я сравниваю это. Что я делаю не так?

+1

У вас слишком много логики в представлении, я бы переместить логику контроллеров. Сделайте просмотр простым, его намного легче проверить. –

+0

Я не вижу смысла всегда назначать одно и то же значение шаблону в каждом действии контроллера, когда я могу иметь одно логическое выражение в самом представлении. Это просто заканчивается ошибками, повторяющимися ... – bekay

+0

Он должен работать ... Вы не используете кеш на своей странице? – Sybio

ответ

3

Хорошо, я протестировал его, у Twig странное поведение. «\» сбежит или что-то вроде этого. Я протянул прут environement с функцией 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 %} 
+0

Хорошо, спасибо, это объясняет! – bekay

+0

Просто хочу добавить, что у ветки есть 'dump()' встроенный, [здесь, как включить его] (http://symfony.com/doc/current/book/templating.html#debugging) в Symfony. – Maerlyn

Смежные вопросы