add active class to link with sf2 and twig add active class to link with sf2 and twig symfony symfony

add active class to link with sf2 and twig


Twig allows for conditionals and the Request object is available throughout the application. If you are including the template, to get the route you want to use:

app.request.attributes.get('_route')

If you are using the render function, you want to use:

app.request.attributes.get('_internal')

With that, you should be able to use:

class="{% if app.request.attributes.get('_route') == '_list' %}active{% endif %}"

or shorter:

class="{{ app.request.get('_route') == '_list' ? 'active' }}"


Sometimes you don't want to do exact matching of a route. For those cases, you can use the "starts with" conditional logic of twig.

As an example, lets assume you are working with books. You have the following routes: book, book_show, book_new, book_edit. You want the navigation item Book to be highlighted for any of those cases. This code would accomplish that.

<a class="{% if app.request.attributes.get('_route') starts with 'book' %}active{% endif %}">Books</a><a class="{% if app.request.attributes.get('_route') starts with 'author' %}active{% endif %}">Authors</a>

This example works with at least Symfony 2.3.x


Shortest version:

{% set route = app.request.get('_route') %} <li class="{{ route starts with 'post' ? 'open' }}"></li> <li class="{{ route starts with 'category' ? 'open' }}"></li>

Sometimes useful:

{% set route = app.request.get('_route') %}<li class="{{ 'post' in route ? 'open' }}"></li><li class="{{ 'category' in route ? 'open' }}"></li>