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

Шаблонизатор Twig

Шаблонизатор Twig — это компонент для веб-приложений, предназначенный для разделения логики представления (шаблонов) от бизнес-логики, реализованный на языке PHP. Twig является одним из наиболее распространённых шаблонизаторов в экосистеме PHP, входящим в состав фреймворка Symfony, но может использоваться и независимо от него.

История

Twig был создан французским разработчиком Фабьеном Потенсье (Fabien Potencier), основателем компании SensioLabs и создателем фреймворка Symfony. Первая стабильная версия (1.0.0) была выпущена в 2009 году. Основной целью разработки было создание безопасного, быстрого и гибкого шаблонизатора, который бы решал проблемы, присущие чистому PHP в шаблонах (например, отсутствие автоматического экранирования вывода и сложность поддержки крупных проектов).

Twig быстро стал стандартом де-факто для Symfony, а затем и для многих других PHP-проектов, включая Drupal (начиная с версии 8), Laravel (через пакет twig/twig или интеграцию TwigBridge) и WordPress (через плагины). В 2017 году была выпущена версия 2.0, которая отказалась от поддержки устаревших версий PHP и ввела строгую типизацию. Версия 3.0, вышедшая в 2019 году, стала основной, сфокусированной на PHP 7.2+ и выше, и принесла улучшения производительности и безопасности.

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

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

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

  • Загрузчик (Loader): Отвечает за поиск и загрузку шаблонов из различных источников (файловая система, база данных, строки). Наиболее распространённый — FilesystemLoader, который ищет шаблоны в заданных директориях.
  • Окружение (Environment): Центральный объект, хранящий конфигурацию (режим отладки, путь к кэшу, набор расширений). Он управляет загрузчиком и компилятором.
  • Компилятор (Compiler): Преобразует AST (абстрактное синтаксическое дерево) шаблона в PHP-код.
  • Расширения (Extensions): Позволяют добавлять в Twig новые функции, фильтры, теги и операторы. Стандартное расширение включает базовые возможности, а пользовательские расширения — способ кастомизации.

Синтаксис и возможности

Синтаксис Twig основан на трёх типах конструкций, которые выделяются фигурными скобками:

  • {{ ... }}Вывод переменной (выражение). Содержимое автоматически экранируется для предотвращения XSS-атак.
  • {% ... %}Теги (управляющие конструкции). Используются для циклов, условий, наследования шаблонов, блоков и т.д.
  • {# ... #}Комментарии. Не выводятся в итоговом HTML.

Переменные и выражения

Переменные передаются в шаблон из контроллера или другого источника. Доступ к свойствам объектов и элементам массивов осуществляется через точку (.) или квадратные скобки ([]). Поддерживаются арифметические, логические и строковые операции.

Фильтры

Фильтры модифицируют вывод переменных. Они применяются с помощью символа |. Примеры:

  • {{ name|upper }} — преобразует строку в верхний регистр.
  • {{ text|striptags|slice(0, 100) }} — удаляет HTML-теги и обрезает текст до 100 символов.
  • {{ date|date("d.m.Y") }} — форматирует дату.

Теги

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

  • {% for item in items %} — цикл по массиву или объекту.
  • {% if condition %} — условный оператор. Поддерживаются elseif и else.
  • {% set var = value %} — создание переменной внутри шаблона.
  • {% include 'template.html.twig' %} — включение другого шаблона.
  • {% extends 'base.html.twig' %}наследование шаблона (см. ниже).

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

Ключевая особенность Twig — мощная система наследования шаблонов. Она позволяет создать базовый «скелет» (layout) с блоками ({% block name %}), а затем в дочерних шаблонах переопределять эти блоки.

Пример базового шаблона base.html.twig: ``twig <!DOCTYPE html> <html> <head> <title>{% block title %}Мой сайт{% endblock %}</title> </head> <body> <header>{% block header %}Шапка сайта{% endblock %}</header> <main>{% block content %}{% endblock %}</main> <footer>{% block footer %}Подвал{% endblock %}</footer> </body> </html> ``

Пример дочернего шаблона page.html.twig: ```twig {% extends 'base.html.twig' %}

{% block title %}Главная страница{% endblock %}

{% block content %} <h1>Добро пожаловать!</h1> <p>Это содержимое страницы.</p> {% endblock %} `` При рендеринге page.html.twig` Twig подставит его содержимое в блоки базового шаблона, заменив содержимое по умолчанию.

Макросы

Макросы — это аналог функций в шаблонах. Они позволяют повторно использовать фрагменты разметки с параметрами. Макросы определяются с помощью тега {% macro %} и вызываются как функции.

Преимущества и недостатки

Преимущества

  • Безопасность: Автоматическое экранирование вывода ({{ var }}) защищает от XSS-атак. Для вывода неэкранированного HTML используется фильтр raw.
  • Производительность: Компиляция в PHP-код и кэширование делают Twig очень быстрым.
  • Чистота кода: Синтаксис лаконичен и читаем. Разделение логики и представления соблюдается строго: в шаблонах нельзя выполнять произвольный PHP-код.
  • Гибкость: Система наследования, макросы, пользовательские расширения и фильтры позволяют адаптировать Twig под любые нужды.
  • Интеграция: Является стандартным шаблонизатором Symfony, легко интегрируется с другими фреймворками и CMS.

Недостатки

  • Порог входа: Для разработчиков, привыкших к чистому PHP в шаблонах, необходимо изучить новый синтаксис.
  • Зависимость: Для работы требуется PHP и установка пакета через Composer. Для простых проектов это может быть избыточно.
  • Сложность отладки: Ошибки в шаблонах иногда сложнее отлаживать, чем в обычном PHP, хотя режим отладки (debug: true) и расширение Twig_Extension_Debug с функцией dump() помогают в этом.

Применение

Twig используется в:

  • Веб-фреймворках: Symfony, Laravel (через пакет), Silex (устарел), Yii (через расширения).
  • Системах управления контентом (CMS): Drupal 8+, eZ Platform, Contao.
  • Генераторах статических сайтов: Sculpin, Jigsaw.
  • Документации и генерации кода: Например, в Symfony для генерации скелетов бандлов.

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

  • Название «Twig» (англ. «веточка») выбрано как метафора к «ветке» (branch) в системах контроля версий, подчёркивая идею наследования шаблонов.
  • Twig вдохновлён шаблонизаторами Django и Jinja2 (Python), что заметно в синтаксисе и философии.
  • Существуют порты Twig для других языков: Twig.js (JavaScript), Twig для Go и Twig для Python (не путать с Jinja2).

Источники

  1. Официальная документация Twig. (twig.symfony.com)
  2. Потенсье, Фабьен. «Symfony 5: The Fast Track». SensioLabs, 2020.
  3. Руководство по Symfony. «Шаблонизатор Twig». (symfony.com/doc/current/templating.html)
  4. Репозиторий Twig на GitHub. (github.com/twigphp/Twig)

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

На главную BFOmetr →