Взаимодействие Twig и Symfony framework. Глобальные переменные(Урок 8.2)

Мы уже знакомы с шаблонизатором twig, умеем писать на нем разметку и подключать внешние файлы(assets). Осталось только рассмотреть некоторые аспекты взаимодействия из Symfony framework.

Во-первых, для того, чтобы отобразить шаблон, в контроллере нужно вызвать метод render:

// src/Acme/ArticleBundle/Controller/ArticleController.php
class ArticleController extends Controller
  {
     public function recentArticlesAction($max = 3)
       {
        $articles = ...;
     return $this->render(
        'AcmeArticleBundle:Article:recentList.html.twig',
        array('articles' => $articles)
       );
      }
}
Массив (второй аргумент) задает список доступных с шаблона переменных.

Кроме того есть возможность работать с глобальными (как для php-скриптов) переменными.

Доступные глобальные переменные:

  • app.security - The security context.
  • app.user - Объект пользователя.
  • app.request - Объект запроса.
  • app.session - Объект сессии.
  • app.environment - Текущее окружение (dev, prod, и т.д.).
  • app.debug - True если debug сборка. False если продакшн.
Глобальные переменные в Twig могут иметь очень полезные применения.

Например, чтобы узнать,  с какого скрипта вызвали рендер шаблона (или его фрагмента), необязательно передавать его имя. Достаточно обратиться до глобального значения (глобальной переменной, или метода) (в данном случае мы получим роут, с которого был вызван шаблон):

 {% if app.request.attributes.get('_route') == "route_name" %}
...
{% endif %}
Также можем получить параметры:
 {{ app.request.attributes.get('_route_params') }}
Также можно очень просто получить параметры пользователя, обращаться до переменных сессии и т.д.

Кроме "стандартных" глобальных переменных есть возможность добавить свои. Для этого нужно модифицировать файл конфигурации:

# app/config/config.yml
twig:
    # ...
    globals:
        ga_tracking: UA-xxxxx-x
Теперь эта переменная будет доступна со всех шаблонов:
<p>The google tracking code is: {{ ga_tracking }}</p>