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

Digital-студия WNDER

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

Twig — это шаблонизатор для PHP. Проще говоря, это инструмент, который позволяет отделить логику приложения от внешнего вида. Вы пишете HTML-шаблоны с специальными конструкциями вроде {{ variable }} и {% if %}, а Twig превращает их в готовый HTML, подставляя нужные данные.

Зачем это нужно? Вот несколько причин:

  • Шаблоны становятся чище. В них нет PHP-кода, только разметка и понятные теги.
  • Безопасность. Twig автоматически экранирует вывод, защищая от XSS-атак.
  • Гибкость. Наследование шаблонов, блоки, макросы — всё это упрощает повторное использование кода.
  • Скорость. Twig компилирует шаблоны в PHP-классы, которые кешируются, так что производительность не страдает.

Многие популярные фреймворки, например Symfony, используют Twig по умолчанию. Но его можно прикрутить к любому проекту, даже к самописному.

Установка и настройка Twig

Самый простой способ установить Twig — через Composer. Если вы ещё не используете Composer, самое время начать: это стандартный менеджер зависимостей в мире PHP.

composer require twig/twig

После установки нужно создать окружение Twig. Обычно это делается в отдельном файле, например init.php:

<?php
require __DIR__ . '/vendor/autoload.php';

$loader = new \Twig\Loader\FilesystemLoader(__DIR__ . '/templates');
$twig = new \Twig\Environment($loader, [
    'cache' => __DIR__ . '/cache',
    'debug' => true,
]);

Здесь мы указали папку с шаблонами (templates) и папку для кеша (cache). Параметр debug полезен при разработке, но на продакшене его лучше отключить.

Синтаксис Twig: основы

В Twig есть три основных конструкции:

  • {{ ... }} — вывод переменной или результата выражения.
  • {% ... %} — теги управления (условия, циклы, блоки).
  • {# ... #} — комментарии.

Давайте посмотрим на простой пример шаблона hello.twig:

<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>Привет, {{ name }}!</h1>
    <p>Текущее время: {{ 'now'|date('H:i') }}</p>
</body>
</html>

А вот как его отрендерить в PHP:

<?php
require 'init.php';

echo $twig->render('hello.twig', [
    'title' => 'Главная страница',
    'name' => 'Иван',
]);

Как видите, ничего сложного. Переменные передаются в шаблон через ассоциативный массив.

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

Одна из самых мощных фич Twig — наследование шаблонов. Вы создаёте базовый шаблон с общим каркасом (header, footer, меню) и определяете в нём блоки, которые дочерние шаблоны могут переопределять.

Пример базового шаблона base.twig:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{% block title %}Мой сайт{% endblock %}</title>
</head>
<body>
    <header>
        <h1>Добро пожаловать!</h1>
    </header>
    <main>
        {% block content %}{% endblock %}
    </main>
    <footer>
        &copy; 2025
    </footer>
</body>
</html>

Теперь дочерний шаблон page.twig:

{% extends 'base.twig' %}

{% block title %}Страница о нас{% endblock %}

{% block content %}
    <h2>О нашей компании</h2>
    <p>Мы делаем крутые вещи.</p>
{% endblock %}

При рендеринге page.twig Twig подставит содержимое блоков в базовый шаблон. Это экономит кучу времени и избавляет от дублирования кода.

Правило: Всегда определяйте базовый шаблон с общими элементами и наследуйтесь от него. Это как конструктор: собрали один раз каркас, а потом меняете только нужные детали.

Фильтры, функции и макросы

Twig богат на встроенные фильтры и функции. Фильтры применяются к переменным через символ |. Например, {{ name|upper }} переведёт строку в верхний регистр. Функции вызываются как обычно: {{ random(1, 10) }}.

Вот таблица с некоторыми популярными фильтрами и их аналогами в PHP:

Фильтр Twig Действие Аналог в PHP
upper Верхний регистр strtoupper()
lower Нижний регистр strtolower()
date Форматирование даты date()
escape Экранирование HTML htmlspecialchars()

Макросы в Twig — это что-то вроде функций, которые можно переиспользовать в разных шаблонах. Они помогают не повторять одинаковую разметку. Пример макроса для вывода формы входа:

{% macro input(name, value, type = 'text') %}
    <input type="{{ type }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}

Использование:

{% import 'forms.twig' as forms %}
{{ forms.input('username', 'Иван') }}

Практические советы и лайфхаки

Вот несколько проверенных приёмов, которые сделают вашу работу с Twig ещё приятнее:

  • Используйте include для вставки повторяющихся фрагментов (например, сайдбара или футера).
  • Для отладки переменных применяйте функцию dump() (доступна при включённом debug).
  • Не забывайте про автоэкранирование: по умолчанию Twig экранирует вывод, но если нужно вывести HTML, используйте фильтр raw.
  • Кеширование шаблонов на продакшене обязательно — это ускоряет рендеринг.
Лайфхак: Чтобы не захламлять шаблоны, выносите сложные вычисления в PHP-код и передавайте в шаблон уже готовые данные. Шаблон должен только отображать.

Итог

Twig — это не просто модный инструмент, а реальный способ сделать код чище и безопаснее. Он разделяет логику и представление, упрощает поддержку проектов и ускоряет разработку. Если вы до сих пор пишете шаблоны на чистом PHP, попробуйте Twig на небольшом проекте — и вы почувствуете разницу. Главное — не забывайте про базовые шаблоны, блоки и кеширование.

Удачи в разработке!

Студия WNDER