Открыть сервис

Twig

Twig — это шаблонизатор для языка программирования PHP, распространяемый под лицензией BSD. Разработан и поддерживается компанией Fabien Potencier, создателем фреймворка Symfony. Twig предоставляет разработчикам синтаксис для отделения логики представления (шаблонов) от бизнес-логики приложения, реализуя архитектурный паттерн MVC (Model-View-Controller). Шаблонизатор компилирует шаблоны в обычный PHP-код, что обеспечивает высокую производительность выполнения.

История

Twig был впервые выпущен в 2009 году как альтернатива встроенному в PHP шаблонизатору, который, по мнению разработчиков, не обладал достаточной гибкостью и безопасностью для крупных проектов. Основной целью создания Twig было предоставление разработчикам более чистого и выразительного синтаксиса, а также встроенных механизмов защиты от распространённых уязвимостей, таких как XSS (межсайтовый скриптинг). Первая стабильная версия 1.0 была выпущена в 2011 году. Версия 2.0, вышедшая в 2017 году, принесла значительные изменения, включая улучшенную поддержку типов и удаление устаревших функций. Версия 3.0, выпущенная в 2019 году, является текущей основной веткой разработки, в которой были внедрены новые возможности, такие как поддержка атрибутов PHP 8 и улучшенная обработка ошибок. Twig является частью экосистемы Symfony и используется по умолчанию в этом фреймворке, но также может быть интегрирован в другие PHP-приложения.

Архитектура и принципы работы

Twig основан на трёх основных компонентах: загрузчик (Loader), среда (Environment) и шаблон (Template).

  • Загрузчик отвечает за поиск и загрузку файлов шаблонов из различных источников (файловая система, база данных, строки). Twig поддерживает несколько типов загрузчиков, включая FilesystemLoader, ArrayLoader и ChainLoader.
  • Среда (Environment) — это центральный объект, который управляет конфигурацией, загрузчиками, расширениями и кэшированием. Она принимает настройки, такие как режим отладки, путь к кэшу и список активных расширений.
  • Шаблон — это скомпилированный PHP-класс, который представляет собой результат обработки исходного файла шаблона. Twig компилирует шаблон в PHP-код при первом обращении, а затем сохраняет его в кэше. При последующих запросах используется скомпилированная версия, что значительно ускоряет выполнение.

Процесс обработки шаблона включает три этапа: загрузка исходного текста, компиляция в PHP-код и выполнение скомпилированного кода с переданными данными.

Синтаксис

Синтаксис Twig использует три основных типа конструкций:

  • Вывод переменных{{ variable }}. Экранирование HTML-символов происходит автоматически, если не указано иное. Для вывода неэкранированного значения используется фильтр raw (например, {{ html_content|raw }}).
  • Управляющие конструкции{% tag %}. Используются для циклов (for), условий (if), наследования шаблонов (extends), включения других шаблонов (include) и других операций.
  • Комментарии{# comment #}. Комментарии не выводятся в результирующий HTML.

Пример базового шаблона

``twig <!DOCTYPE html> <html> <head> <title>{% block title %}Заголовок по умолчанию{% endblock %}</title> </head> <body> <h1>{{ page_title }}</h1> <ul> {% for item in items %} <li>{{ item.name }} ({{ item.price|number_format(2, '.', ' ') }} руб.)</li> {% else %} <li>Список пуст</li> {% endfor %} </ul> </body> </html> ``

Основные возможности

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

Twig поддерживает наследование шаблонов, что позволяет создавать базовый макет (layout) и переопределять его блоки в дочерних шаблонах. Это реализуется с помощью тегов {% extends %} и {% block %}. Базовый шаблон определяет структуру страницы, а дочерние шаблоны заполняют конкретные блоки контентом.

Фильтры

Фильтры применяются к переменным для изменения их отображения. Они записываются после символа |. Примеры встроенных фильтров:

  • {{ 'hello'|upper }} — преобразует строку в верхний регистр.
  • {{ '2023-01-01'|date('d.m.Y') }} — форматирует дату.
  • {{ text|slice(0, 100) }} — обрезает строку до 100 символов.
  • {{ array|join(', ') }} — объединяет элементы массива в строку.
  • {{ value|default('значение по умолчанию') }} — выводит значение по умолчанию, если переменная не определена.

Теги

Теги — это управляющие конструкции, которые выполняют логические операции. Основные встроенные теги:

  • {% if %} / {% elseif %} / {% else %} — условный оператор.
  • {% for %} / {% endfor %} — цикл по массиву или диапазону.
  • {% set %} — присваивание значения переменной.
  • {% include %} — включение другого шаблона.
  • {% extends %} — наследование шаблона.
  • {% block %} — определение блока для переопределения.
  • {% macro %} — определение макроса (функции шаблона).

Макросы

Макросы позволяют определять повторно используемые фрагменты шаблона, аналогичные функциям. Они могут принимать аргументы и возвращать HTML-код. Макросы определяются с помощью тега {% macro %} и вызываются как {{ macro_name(arguments) }}.

Автоматическое экранирование

Twig автоматически экранирует все выводимые переменные в зависимости от контекста (HTML, JavaScript, CSS). Это предотвращает XSS-атаки. Разработчик может отключить экранирование для конкретной переменной с помощью фильтра raw или изменить стратегию экранирования глобально.

Расширения

Twig имеет модульную архитектуру, позволяющую подключать расширения. Расширения могут добавлять новые фильтры, теги, функции, операторы и тесты. В состав Twig входят несколько встроенных расширений:

  • Core — основные функции и фильтры.
  • Escaper — управление экранированием.
  • Optimizer — оптимизация скомпилированного кода.
  • Debug — отладочные функции, включая dump().

Разработчики могут создавать собственные расширения для добавления специфической функциональности, например, интеграции с другими библиотеками или фреймворками.

Производительность и кэширование

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

Интеграция с PHP-фреймворками

Twig является стандартным шаблонизатором для Symfony и используется в таких фреймворках, как Drupal (начиная с версии 8), Laravel (через пакет twig/twig), Slim и других. В Symfony Twig интегрирован на уровне ядра, поддерживая автоматическую загрузку шаблонов из пакетов, наследование и расширение через конфигурацию. В Drupal Twig используется для рендеринга тем оформления, предоставляя дизайнерам и разработчикам безопасный и гибкий инструмент для создания интерфейсов.

Сравнение с другими шаблонизаторами

Twig часто сравнивают с другими шаблонизаторами для PHP, такими как Smarty, Blade (используется в Laravel) и Mustache.

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

Критика

Основные замечания к Twig связаны с его производительностью по сравнению с простым PHP-кодом. Хотя кэширование компенсирует это в production-среде, в режиме разработки компиляция может замедлять работу. Также некоторые разработчики считают, что синтаксис Twig излишне сложен для простых проектов, где можно обойтись встроенными средствами PHP. Кроме того, для работы с Twig требуется дополнительное обучение, что может быть барьером для новичков.

Интересные факты

  • Twig поддерживает песочницу (sandbox), которая позволяет ограничивать доступные функции и фильтры в шаблонах, что полезно при рендеринге пользовательского контента.
  • В Twig есть встроенная поддержка интернационализации (i18n) через расширение TranslationExtension, которое интегрируется с библиотеками перевода, такими как symfony/translation.
  • Twig может использоваться не только для генерации HTML, но и для создания текстовых файлов, XML, JSON, CSS и JavaScript.

Источники

  • Официальная документация Twig (twig.symfony.com)
  • Книга «Symfony 5: The Fast Track» (Fabien Potencier)
  • Руководство по Drupal 8: Theming with Twig (Chaz Chumley)
  • Статья «Twig vs Blade: A Comparison of PHP Templating Engines» (SitePoint)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →