Использование шаблонов (template) у Symfony framework. (Урок 7. Twig)

Использование шаблонов (template) у Symfony framework возможно несколькими способами. Во первых, можно использовать php-шаблоны. Но более предпочтительным вариантом есть использование шаблонизатора Twig (по умолчанию). Twig - компилирующий обработчик шаблонов с открытым исходным кодом, написанный на языке программирования PHP. На выходе он дает php/html код. Кроме того, что Twig очень функциональный, он еще и очень быстрый.

Итак, для начала важно понять некоторые особенности. Twig расширяет html путем введения трех директив:

{{ ... }} - вывод чего-то - значение переменной, результат выполнения функции и т.д.

{% ... %} - логика шаблона. Здесь могут быть циклы, условия и другие структуры.

{# ... #} - комментарии.

Рассмотрим первые две директивы подробней.

С первой директивой все просто: в результате выводится значение переменной либо выражения:

{{ title }}
Или с массивом:
{{ content['sidebar'] }}
Со второй директивой все намного интересней. =)

Пример использования условий:

{% if title is defined %}
  <h1>{{ title }}</h1>
{% endif %}
Циклы:
{% for user in users %}
  {{ user.username }}
{% endfor %}
Twig имеет некоторые встроенные функции: range, cycle, constant, random, attribute, block, parent, dump, date.

Удобно использовать фильтры: date, format, replace, url_encode, json_encode, title, capitalize, upper, lower, striptags, join, reverse, length, sort, merge, default, keys, escape, e

Например, следующий фрагмент выведет текст большими буквами:

{{"some text" | upper}}
Также предусмотрено подключение внешних файлов:
{% include 'root/page.html' %}
Но это все выглядит не столь эффектно (так как это все очень просто сделать при помощи php), как наследие шаблонов у Twig (inheritance in Twig).

У Twig создаются элементы, блоки:

{% block content %}
  <h1>Some text</h1> 
{% endblock %}

{% block other_content %} <h1>Some other text </h1> {% endblock %}

Создать наследника можно следующим образом:
{% extends '::base.html.twig' %}
{% block content %}
  <h1>Inherited text</h1> 
{% endblock %}
Таким образом у унаследованном шаблоне блок будет замещен. Если возникает надобность дополнить блок, достучаться до значения родительского элемента можно использовав функцию parent(). Например:
{% extends '::base.html.twig' %}
{% block content %}
  parent()
  <h1>Inherited text</h1> 
{% endblock %}
На этом, в принципе и все относительно особенностей Twig, необходимых для начала работы.

Рассмотрим некоторые аспекты взаимодействия Twig и Symfony framework.

Как вы должны были знать из Урока 3, по умолчанию шаблоны размещаются в src/Bundle_name/Resources/view. При работе с шаблонами адресация (это важно, например, при использовании механизма наследования) следующая: bundle:controller:template. Например:

{% extends 'NameMyBundle:Default:basic_template.html.twig' %}
В следующем уроке мы научимся подключать css, js, картинки и прочие внешние ресурсы.