Шаблоны Twig
Twig — язык шаблонов Symfony. В нём нет PHP-кода: только разметка и короткие конструкции для вывода данных. Шаблоны лежат в папке templates и называются имя.html.twig.
Вывод
Двойные фигурные скобки выводят значение:
<h1>{{ title }}</h1>
<p>Автор: {{ post.author.name }}</p>Точка работает и для массивов, и для объектов: post.title вызовет метод getTitle() или прочитает ключ title.
Весь вывод экранируется автоматически: <script> из данных пользователя превратится в безопасный текст.
Условия
{% if posts is empty %}
<p>Статей пока нет.</p>
{% elseif posts|length == 1 %}
<p>Одна статья.</p>
{% else %}
<p>Статей: {{ posts|length }}</p>
{% endif %}Конструкции с действиями записывают в {% %}, вывод — в {{ }}.
Циклы
<ul>
{% for post in posts %}
<li>{{ loop.index }}. {{ post.title }}</li>
{% else %}
<li>Ничего не найдено</li>
{% endfor %}
</ul>Ветка else выполняется, если список пуст. В переменной loop — номер шага: loop.index, loop.first, loop.last.
Фильтры
Фильтр преобразует значение и записывается через вертикальную черту:
{{ post.title|upper }}
{{ post.createdAt|date('d.m.Y') }}
{{ post.body|slice(0, 100) }}…
{{ user.nickname|default('Гость') }}
{{ price|number_format(2, ',', ' ') }}Наследование
Общий каркас страницы описывают один раз — в базовом шаблоне с блоками:
{# templates/base.html.twig #}
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Блог{% endblock %}</title>
</head>
<body>
<main>{% block body %}{% endblock %}</main>
</body>
</html>Страница наследует каркас и заполняет блоки:
{# templates/blog/index.html.twig #}
{% extends 'base.html.twig' %}
{% block title %}Статьи{% endblock %}
{% block body %}
<h1>Статьи</h1>
{% endblock %}Подключение частей
Повторяющийся фрагмент выносят в отдельный файл:
{% for post in posts %}
{{ include('blog/_card.html.twig', {post: post}) }}
{% endfor %}Имена таких файлов принято начинать с подчёркивания.
Ссылки и файлы
<a href="{{ path('blog_show', {slug: post.slug}) }}">Читать</a>
<img src="{{ asset('images/logo.png') }}" alt="Логотип">path() строит адрес по имени маршрута, asset() — путь к файлу из папки public.
Частая ошибка
Фильтр raw отключает экранирование. Если вывести через него текст, введённый пользователем, на страницу попадёт чужой скрипт. Применяйте raw только к разметке, которую создали сами или очистили на сервере.
{{ comment.text|raw }} {# опасно #}
{{ comment.text }} {# безопасно #}