
Twig – современный шаблонизатор для PHP, обеспечивающий строгую разделённость логики и представления. Встроенные фильтры и функции позволяют минимизировать использование чистого PHP в шаблонах, сохраняя код читаемым и безопасным. Для передачи данных из PHP в Twig используется массив контекста: ключи массива становятся доступными переменными внутри шаблона.
Прямое внедрение PHP в Twig возможно через функцию {{ php() }} или расширения, но это рекомендуется лишь для редких случаев, таких как динамическая генерация сложных значений, недоступных стандартными фильтрами. При этом критически важно ограничивать выполнение стороннего кода, чтобы избежать уязвимостей XSS и инъекций.
Передача массивов, объектов и коллекций из PHP в Twig также требует внимательности: доступ к вложенным элементам лучше организовать через методы или геттеры, чтобы предотвратить ошибки и сохранить совместимость при изменениях структуры данных. Такой подход упрощает тестирование и поддержку проекта.
Использование PHP в Twig должно быть целенаправленным и ограниченным. Максимальное применение встроенных возможностей Twig, расширений и фильтров делает код предсказуемым, безопасным и масштабируемым.
Подключение PHP-переменных к шаблону Twig

Передача данных из PHP в Twig осуществляется через метод render() объекта Twig. Все переменные передаются в виде ассоциативного массива, где ключ соответствует имени переменной в шаблоне.
Пример базового подключения:
<?php
$twig = new \Twig\Environment($loader);
$data = [
'title' => 'Главная страница',
'user' => ['name' => 'Иван', 'age' => 28]
];
echo $twig->render('index.twig', $data);
?>
В шаблоне Twig доступ к переменным осуществляется через двойные фигурные скобки:
<h1>{{ title }}</h1>
<p>Имя пользователя: {{ user.name }}</p>
<p>Возраст: {{ user.age }}</p>
Рекомендации по подключению переменных:
- Используйте строгие ключи массива: избегайте динамического формирования имен переменных для предотвращения ошибок в шаблоне.
- Передавайте только необходимые данные: большое количество переменных снижает производительность и затрудняет поддержку.
- Для сложных структур данных применяйте вложенные массивы или объекты, чтобы логика отображения оставалась в шаблоне Twig минимальной.
- Если переменные должны быть доступны глобально во всех шаблонах, зарегистрируйте их через
$twig->addGlobal():
$twig->addGlobal('site_name', 'Мой сайт');
Для передачи массивов и объектов с динамическими данными используйте фильтры Twig для их форматирования. Например:
<ul>
{% for product in products %}
<li>{ product.name }} – {{ product.price} ₽</li>
{% endfor %}
</ul>
Для оптимизации загрузки шаблонов и переменных можно объединять данные в единый массив и передавать его целиком, вместо множества отдельных вызовов:
$context = array_merge($commonData, $pageData);
echo $twig->render('page.twig', $context);
Создание пользовательских функций Twig на основе PHP

Для добавления собственных функций в Twig используется объект \Twig\Environment и метод addFunction. Функция регистрируется через \Twig\TwigFunction, который принимает имя функции, вызываемый PHP-код и массив опций. Например, для создания функции форматирования даты:
$twig->addFunction(new \Twig\TwigFunction('format_date', function (\DateTime $date, string $format = 'd.m.Y') { return $date->format($format); }));
В шаблоне Twig функция будет доступна как {{ format_date(post.date) }}. Можно передавать необязательные аргументы и устанавливать опцию is_safe для предотвращения экранирования HTML:
$twig->addFunction(new \Twig\TwigFunction('raw_html', function (string $html) { return $html; }, ['is_safe' => ['html']]));
Для упрощения поддержки и тестирования рекомендуется помещать функции в отдельные PHP-классы, наследующие \Twig\Extension\AbstractExtension, и переопределять метод getFunctions(). Пример:
class AppTwigExtension extends \Twig\Extension\AbstractExtension { public function getFunctions() { return [ new \Twig\TwigFunction('format_price', [$this, 'formatPrice']), ]; } public function formatPrice(float $value): string { return number_format($value, 2, '.', ' ') . ' ₽'; } }
После регистрации расширения через $twig->addExtension(new AppTwigExtension()); функция format_price() становится доступной во всех шаблонах Twig.
При создании пользовательских функций важно учитывать производительность: избегать тяжелых операций внутри функции, кешировать результаты и минимизировать прямые обращения к базе данных. Это позволяет сохранять скорость рендеринга и совместимость с кеширующими механизмами Twig.
Использование PHP-классов внутри Twig-шаблонов

Для работы с PHP-классами в Twig необходимо передавать объекты в шаблон через массив контекста при рендеринге. Пример: $twig->render('template.twig', ['user' => $userObject]);, где $userObject – экземпляр класса User.
В шаблоне доступ к методам и свойствам класса осуществляется через точечную нотацию: {{ user.getName() }} или {{ user.email }}. Twig автоматически вызывает публичные методы без скобок, если метод не требует аргументов.
Для повышения безопасности рекомендуется ограничивать доступ к методам только через публичные интерфейсы, избегая передачи объектов с критическими внутренними данными. В качестве альтернативы можно создавать адаптеры или DTO, которые предоставляют только необходимые свойства.
Если метод класса требует аргументы, передавать их можно прямо в шаблоне: {{ user.getProfile('short') }}. Для сложных вычислений лучше использовать фильтры или функции Twig, зарегистрируемые через $twig->addFunction() или $twig->addFilter(), чтобы не перегружать шаблон бизнес-логикой.
Можно использовать статические методы класса через специальную функцию Twig: {{ constant('App\\Utils\\Formatter::formatDate')('2025-09-17') }}, что позволяет вызывать статические методы без создания экземпляра объекта.
Для коллекций объектов применяются фильтры map и filter: map(u => u.getEmail())}, что обеспечивает чистый и читаемый синтаксис при обработке массивов объектов.
Регистрация сервисов и классов в Twig через контейнер зависимостей позволяет использовать объекты без явного создания экземпляров в шаблоне, например: {{ mailer.send(email) }}, где mailer – сервис с заранее настроенным классом.
Передача массивов и объектов из PHP в Twig

Для передачи массивов в Twig используйте метод `render` или функцию `with` при рендеринге шаблона. Например, массив пользователей можно передать так:
$users = [ ['id' => 1, 'name' => 'Иван'], ['id' => 2, 'name' => 'Мария'] ];
echo $twig->render('users.twig', ['users' => $users]);
В Twig доступ к элементам массива осуществляется через ключи или циклы:
{% for user in users %}{{ user.name }}{% endfor %}
Объекты передаются аналогично массивам. Twig позволяет обращаться к публичным свойствам и методам без дополнительных преобразований. Например:
$product = new Product();
$product->id = 101; $product->name = 'Телефон';
echo $twig->render('product.twig', ['product' => $product]);
В шаблоне доступ к объекту через свойства или методы:
{{ product.name }} или {{ product.getName() }}
Для вложенных структур Twig автоматически поддерживает доступ к массивам внутри объектов и объектов внутри массивов:
{{ users[0].name }} или {{ product.category.name }}
Рекомендуется передавать в Twig только необходимые данные, избегая лишних методов и приватных свойств, чтобы снизить нагрузку и упростить шаблоны.
При передаче больших массивов или коллекций используйте фильтры Twig, такие как `filter` и `map`, чтобы обрабатывать данные непосредственно в шаблоне без изменения PHP-кода.
Обработка условий и циклов через PHP-данные в Twig
Twig позволяет напрямую использовать данные, переданные из PHP, для управления логикой отображения шаблонов. Основные конструкции – if, for и фильтры – работают с массивами и объектами, переданными через контроллер.
Пример передачи данных из PHP:
$products = [
['name' => 'Ноутбук', 'price' => 75000, 'stock' => 5],
['name' => 'Монитор', 'price' => 15000, 'stock' => 0],
['name' => 'Клавиатура', 'price' => 3000, 'stock' => 12],
];
echo $twig->render('catalog.html.twig', ['products' => $products]);
{% for product in products %}
{% if product.stock > 0 %}
<p>{{ product.name }} доступен за {{ product.price }} ₽</p>
{% else %}
<p>{{ product.name }} временно отсутствует</p>
{% endif %}
{% endfor %}
Рекомендации по работе с циклами и условиями:
- Использовать
for product in productsдля итерации по массивам, переданным из PHP. - Применять
ifдля проверки наличия данных или состояния, напримерstock > 0. - Для сложных условий объединять логические операторы
and,or,notвместо создания нескольких вложенныхif. - Использовать фильтры Twig (
|length,|default,|sort) для динамической обработки массивов без изменения PHP-кода. - Для массивов с объектами обращаться к свойствам через точку:
product.name,product.price.
Пример фильтрации с использованием условия внутри цикла:
{% for product in products if product.stock > 0 %}
<p>{{ product.name }} доступен в наличии</p>
{% endfor %}
Для массивов с большим количеством элементов рекомендуется заранее подготовить данные в PHP, например сортировать по цене или количеству, чтобы Twig оставался максимально легковесным и только рендерил результат.
Использование loop предоставляет доступ к счетчику итераций и проверке последнего элемента:
{% for product in products %}
<p>{{ loop.index }}. {{ product.name }}{% if loop.last %} - последний товар{% endif %}</p>
{% endfor %}
Добавление фильтров Twig с использованием PHP

Для расширения функциональности Twig можно создавать пользовательские фильтры на PHP. Фильтр определяется через объект Twig\TwigFilter и подключается к среде Twig с помощью метода addFilter().
Пример создания фильтра, который переводит строку в верхний регистр:
use Twig\TwigFilter;
$filter = new TwigFilter('uppercase', function ($string) { return strtoupper($string); });
$twig->addFilter($filter);
В шаблоне фильтр вызывается как uppercase }, результат – ТЕКСТ.
Для фильтров, требующих аргументов, функция PHP может принимать несколько параметров. Например, фильтр для обрезки строки с указанием длины:
$filter = new TwigFilter('truncate', function ($string, $length) { return mb_substr($string, 0, $length); });
$twig->addFilter($filter);
Использование: truncate(6) } – результат Пример.
При создании фильтров рекомендуется учитывать поддержку многоязычных символов через mb-функции и проверку типа входных данных для предотвращения ошибок. Фильтры можно регистрировать в отдельном классе, реализующем Twig\Extension\ExtensionInterface, что упрощает масштабирование проекта.
Пример конфигурации:
$loader = new \Twig\Loader\FilesystemLoader('/path/to/templates');
$twig = new \Twig\Environment($loader, [
'debug' => true,
]);
$twig->addExtension(new \Twig\Extension\DebugExtension());
Для отлова PHP-ошибок внутри Twig удобно использовать блок `try-catch`. Например, при вызове методов объектов:
{% set result = null %}
{% try %}
{% set result = object.method() %}
{% catch %}
{% set result = 'Ошибка выполнения метода' %}
{% endtry %}
{{ result }}
Кроме того, Twig поддерживает фильтр `|default`, который позволяет избежать ошибок при обращении к несуществующим переменным:
{ user.name}
Для централизованного логирования ошибок рекомендуется настроить обработчик ошибок PHP совместно с Twig:
set_error_handler(function($severity, $message, $file, $line) {
error_log("Ошибка PHP: [$severity] $message в $file:$line");
});
Использование таблицы помогает систематизировать основные техники отладки:
| Метод | Назначение | Пример |
|---|---|---|
| debug режим Twig | $twig = new \Twig\Environment($loader, [‘debug’ => true]); | |
| DebugExtension | Использование функции dump() в шаблоне | {{ dump(user) }} |
| Фильтр |default | Предотвращение ошибок при отсутствии переменной | default(‘Не задано’) } |
| try-catch в шаблоне | Отлавливание ошибок выполнения PHP-логики | {% try %}…{% catch %}…{% endtry %} |
| PHP error handler | Логирование всех ошибок PHP в один файл | set_error_handler(function($severity, $message,…){…}); |
Вопрос-ответ:
Можно ли напрямую использовать PHP-код внутри шаблонов Twig?
Нет, Twig специально разработан так, чтобы отделять логику приложения от шаблонов представления. Прямое написание PHP-кода в Twig не поддерживается. Вместо этого для работы с данными рекомендуется передавать их из PHP-скриптов в шаблон через массивы или объекты и использовать встроенные Twig-фильтры и функции для обработки этих данных.
Какие способы передачи данных из PHP в Twig наиболее удобны?
Обычно данные передаются через массивы или объекты, которые передаются в метод render шаблона. Например, можно создать массив с ключами, соответствующими переменным шаблона, и значениями, которые будут отображаться. Twig автоматически делает эти значения доступными для вывода и дальнейшей обработки внутри шаблона.
Можно ли создавать собственные функции или фильтры Twig на PHP?
Да, Twig позволяет добавлять пользовательские функции и фильтры на PHP. Это делается через расширения: создаётся класс, который наследует \Twig\Extension\AbstractExtension, и в нём регистрируются новые функции или фильтры. После подключения расширения к окружению Twig новые возможности будут доступны в шаблонах, как встроенные инструменты.
Как обрабатывать условные конструкции и циклы в Twig без PHP?
Twig имеет собственный синтаксис для условий и циклов. Для ветвлений используется тег {% if %}, а для повторений — {% for %}. Эти конструкции позволяют проверять значения переменных, перебирать массивы и объекты, применять фильтры к элементам, не прибегая к PHP-коду напрямую. Такой подход поддерживает чистоту шаблонов и облегчает их сопровождение.
Можно ли подключать сторонние PHP-библиотеки в шаблонах Twig?
Прямое подключение библиотек в шаблоне невозможно. Вместо этого библиотеку подключают в PHP-коде, а её функционал используют для обработки данных перед передачей в шаблон. После подготовки данных шаблон Twig может только отображать их, применяя фильтры, циклы и условия, без вызова функций библиотеки внутри самого шаблона.
