Twig: Как перестать писать PHP-лапшу и полюбить шаблоны

19 Jun, 2026
8,364
🔱 1,286
👥 208

Знакомая ситуация? Открываешь файл, а там — дикая смесь из HTML-разметки, вкраплений <?php echo $variable; ?>, условий if вперемешку с тегами и циклов, генерирующих таблицы. Читать сложно, поддерживать — еще сложнее. В моей практике это одна из главных причин, почему проекты со временем превращаются в "технический долг на ножках".

Сегодня я хочу рассказать об инструменте, который уже много лет помогает PHP-разработчикам наводить порядок во фронтенде. Встречайте — Twig, гибкий, быстрый и безопасный шаблонизатор для PHP.

Что такое Twig и зачем он нужен?

Если коротко, Twig — это способ отделить логику вашего приложения от его представления. Представьте, что у вас есть два специалиста: бэкенд-разработчик, который работает с данными и бизнес-логикой, и фронтенд-разработчик (или верстальщик), который отвечает за HTML-разметку. Twig — это мост между ними.

Бэкендер готовит данные (например, получает из базы список статей), а затем передает их в шаблон Twig. Верстальщик в этом шаблоне работает с простым и понятным синтаксисом, чтобы красиво вывести эти данные, не залезая в дебри PHP.

Результат? Чистый код, который легко читать и поддерживать. Бэкендер не думает о классах CSS, а верстальщик не рискует случайно сломать бизнес-логику.

Реклама

Интересно, что создатели Twig вдохновлялись шаблонизаторами из мира Python — Django и Jinja. Если вы работали с этими фреймворками, синтаксис покажется вам до боли знакомым. И да, Twig — это стандартный шаблонизатор для популярного фреймворка Symfony, что говорит о его зрелоosti и надежности.

Ключевые возможности: что под капотом?

Давайте посмотрим, какие "суперсилы" Twig дает разработчику.

1. Простой и читаемый синтаксис

Вместо громоздких конструкций PHP мы получаем элегантные и лаконичные теги.

Сравните сами.

Как это часто выглядит с нативным PHP:

<ul>
    <?php foreach ($users as $user): ?>
        <li>
            <a href="/users/<?php echo htmlspecialchars($user['id'], ENT_QUOTES, 'UTF-8'); ?>">
                <?php echo htmlspecialchars(strtoupper($user['name']), ENT_QUOTES, 'UTF-8'); ?>
            </a>
        </li>
    <?php endforeach; ?>
</ul>

А вот как это выглядит с Twig:

<ul>
    {% for user in users %}
        <li>
            <a href="/users/{{ user.id }}">
                {{ user.name|upper }}
            </a>
        </li>
    {% endfor %}
</ul>

Согласитесь, второй вариант гораздо чище. Здесь используются всего две основные конструкции:

  • {{ ... }} — для вывода переменной.
  • {% ... %} — для управляющих конструкций, таких как циклы (for) или условия (if).

2. Автоматическая защита от XSS-атак

Одна из самых крутых фич Twig — это автоматическое экранирование выводимых данных. В примере с нативным PHP выше вы видели htmlspecialchars()? Эту функцию нужно вызывать каждый раз, когда вы выводите данные от пользователя, чтобы защититься от XSS-атак (когда злоумышленник пытается внедрить вредоносный скрипт на вашу страницу).

Забыть вызвать htmlspecialchars — одна из самых частых ошибок, приводящих к уязвимостям. Twig решает эту проблему кардинально: по умолчанию он экранирует всё.

Если же вам действительно нужно вывести HTML-код как есть (например, из WYSIWYG-редактора), вы можете явно указать это с помощью фильтра raw:

{# Этот вывод безопасен, Twig преобразует <script> в &lt;script&gt; #}
{{ user_comment }}

{# А здесь мы доверяем источнику и выводим HTML без изменений #}
{{ trusted_html_content|raw }}

Это осознанное решение, которое заставляет разработчика дважды подумать о безопасности.

3. Наследование шаблонов

Знакома ли вам проблема дублирования кода в верстке? Шапка, подвал, боковое меню — все эти элементы повторяются на каждой странице. Twig предлагает элегантное решение — наследование.

Вы создаете базовый шаблон-каркас, в котором определяете основные блоки.

base.html.twig

<!DOCTYPE html>
<html>
    <head>
        <title>{% block title %}Мой сайт{% endblock %}</title>
    </head>
    <body>
        <header>
            <h1>Логотип и навигация</h1>
        </header>

        <main>
            {% block content %}{% endblock %}
        </main>

        <footer>
            <p>&copy; 2024</p>
        </footer>
    </body>
</html>

А затем на конкретных страницах вы просто "наследуете" этот каркас и переопределяете нужные блоки.

user_profile.html.twig

{% extends "base.html.twig" %}

{% block title %}Профиль пользователя {{ user.name }}{% endblock %}

{% block content %}
    <h2>Информация о пользователе</h2>
    <p>Имя: {{ user.name }}</p>
    <p>Email: {{ user.email }}</p>
{% endblock %}

Больше никакого копирования header.php и footer.php через include!

4. Расширяемость: фильтры и функции

Twig поставляется с огромным набором встроенных "помощников" — фильтров и функций. Нужно отформатировать дату, обрезать строку, посчитать количество элементов в массиве? Все это делается одной командой.

{{ "Hello, World!"|upper }}       {# HELLO, WORLD! #}
{{ "Some long text"|slice(0, 4) }} {# Some #}
{{ user.signup_date|date("d.m.Y") }} {# 06.12.2024 #}
{{ users|length }}                 {# Выведет количество пользователей в массиве #}

Самое главное — вы легко можете добавлять свои собственные фильтры и функции, инкапсулируя сложную логику форматирования и делая ее доступной в любом шаблоне.

Как это работает под капотом?

Многих волнует вопрос производительности. Не будет ли шаблонизатор тормозить сайт? В случае с Twig — нет.

Хитрость в том, что Twig — это компилирующий шаблонизатор. Когда шаблон используется впервые, Twig преобразует его в нативный PHP-код и сохраняет в кэше. Все последующие запросы будут использовать уже скомпилированный, оптимизированный PHP-файл. Накладные расходы на парсинг шаблона возникают только один раз. В итоге производительность практически не отличается от использования чистого PHP.

Где применяется Twig?

Хотя Twig является частью экосистемы Symfony, он абсолютно независим и может быть интегрирован в любой PHP-проект, будь то самописная CMS, старый легаси-проект, который вы хотите привести в порядок, или даже фреймворк вроде Laravel (хотя у него есть свой отличный шаблонизатор Blade).

Twig используется по умолчанию в таких популярных системах, как:

  • Symfony
  • Drupal 8+
  • Craft CMS
  • Bolt CMS

И это далеко не полный список.

Выводы: стоит ли пробовать?

Однозначно, да. Если вы все еще смешиваете PHP и HTML, переход на Twig станет для вас глотком свежего воздуха.

Кому особенно подойдет Twig:

  • Начинающим PHP-разработчикам: он приучает к хорошей практике разделения логики и представления с самого начала.
  • Командам с верстальщиками: он позволяет безопасно передавать задачи по верстке, не опасаясь, что сломается PHP-код.
  • Разработчикам на Symfony: для вас это основной инструмент.
  • Тем, кто поддерживает старые проекты: интеграция Twig может стать первым шагом к рефакторингу и наведению порядка.

Twig — это не просто "еще один шаблонизатор". Это зрелый, мощный и безопасный инструмент, который делает код чище, а жизнь разработчика — проще.

Blackfire.io

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.