bekay
bekay

Reputation: 1830

Twig: filter in an if condition

I want to use an filter in an if condition in Twig. The reason for this is a Symfony2 attribute, which I can't compare directly, I have to change it beforehand. I have started with this code:

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

Unfortunately this does not function. So I thought I would use set before the comparison:

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

Guess what? "do something" is not printed, even if the variable controller now exists and has the value I compare it with. What am I doing wrong?

Upvotes: 2

Views: 3392

Answers (1)

Sybio
Sybio

Reputation: 8645

Ok I tested it, Twig has a strange behavior. "\" is escaped or something like this. I extended my twig environement with the var_dump function, check this:

{{ 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"

That's why your test is always false. You need to double the backslashes of your compared string...

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

Upvotes: 3

Related Questions