Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Шаблоны 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 }}      {# безопасно #}

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.