Синтаксис и операторы
Разделители
Twig использует три типа разделителей:
| Разделитель | Назначение | Пример |
|---|---|---|
{{ ... }} | Вывод выражения | {{ user.name }} |
{% ... %} | Выполнение инструкций | {% if active %}...{% endif %} |
{# ... #} | Комментарии (не попадают в HTML) | {# Заметка в шаблоне #} |
Переменные
Доступ к свойствам
Доступ к свойствам
{# Точечная нотация #}
{{ user.name }}
{{ user.address.city }}
{# Скобочная нотация #}
{{ user['name'] }}
{{ data['key-with-dashes'] }}
{# Вызов методов #}
{{ user.getName() }}
{{ items.count() }}
{# Null-safe оператор (Twig 3.x) #}
{{ user?.address?.city }}
{# Вернёт null вместо ошибки, если user или address равны null #}
Глобальные переменные
Глобальные переменные
{# Текущее имя шаблона #}
{{ _self }}
{# Текущий контекст (все переменные) #}
{{ dump(_context) }}
{# Кодировка #}
{{ _charset }}
Литералы
Строки
Строки
{# Одинарные или двойные кавычки #}
{{ "Hello" }}
{{ 'World' }}
{# Интерполяция строк (только в двойных кавычках) #}
{{ "Hello #{user.name}!" }}
{{ "Итого: #{price * quantity} руб." }}
{# Экранирование #}
{{ "Строка с \"кавычками\"" }}
{{ 'It\'s fine' }}
Числа
Числа
{{ 42 }}
{{ 3.14 }}
{{ -17 }}
Логические и null
Логические и null
{{ true }}
{{ false }}
{{ null }}
{{ none }} {# синоним null #}
Массивы
Массивы
{# Создание массива #}
{% set items = ['apple', 'banana', 'cherry'] %}
{% set matrix = [[1, 2], [3, 4]] %}
{# Доступ по индексу #}
{{ items[0] }} {# apple #}
Хеши (ассоциативные массивы)
Хеши (ассоциативные массивы)
{% set user = {name: 'John', age: 30, 'key-with-dashes': true} %}
{# Ключи могут быть строками или выражениями #}
{% set data = {
(variable): 'value',
'static-key': 'value'
} %}
{{ user.name }} {# John #}
Операторы
Арифметические
| Оператор | Описание | Пример |
|---|---|---|
+ | Сложение | {{ 1 + 2 }} -> 3 |
- | Вычитание | {{ 5 - 3 }} -> 2 |
* | Умножение | {{ 2 * 3 }} -> 6 |
/ | Деление | {{ 10 / 3 }} -> 3.333... |
// | Целочисленное деление | {{ 10 // 3 }} -> 3 |
% | Остаток от деления | {{ 10 % 3 }} -> 1 |
** | Возведение в степень | {{ 2 ** 10 }} -> 1024 |
Сравнения
| Оператор | Описание |
|---|---|
== | Равно |
!= | Не равно |
< | Меньше |
> | Больше |
<= | Меньше или равно |
>= | Больше или равно |
=== | Строгое сравнение (тип и значение) |
<=> | Spaceship (возвращает -1, 0, 1) |
Логические
| Оператор | Описание | Пример |
|---|---|---|
and | Логическое И | {% if a and b %} |
or | Логическое ИЛИ | {% if a or b %} |
not | Логическое НЕ | {% if not active %} |
xor | Исключающее ИЛИ | {% if a xor b %} |
Побитовые
| Оператор | Описание |
|---|---|
b-and | Побитовое И |
b-or | Побитовое ИЛИ |
b-xor | Побитовое исключающее ИЛИ |
Строковые
Строковые
{# Конкатенация с помощью ~ #}
{{ 'Hello ' ~ user.name ~ '!' }}
{{ 'Цена: ' ~ price ~ ' руб.' }}
Оператор вхождения
Оператор вхождения
{# in - проверка наличия в массиве или подстроки #}
{% if 'admin' in user.roles %}
{% if 'hello' in message %}
{# not in #}
{% if user.status not in ['banned', 'deleted'] %}
{# starts with / ends with #}
{% if filename starts with 'temp_' %}
{% if email ends with '@gmail.com' %}
{# matches - регулярное выражение #}
{% if login matches '/^[a-zA-Z0-9_]{4,16}$/' %}
Тернарный оператор
Тернарный оператор
{# Полная форма #}
{{ active ? 'Да' : 'Нет' }}
{# Сокращённая форма (Elvis) #}
{{ username ?: 'Аноним' }}
{# Null-coalescing оператор #}
{{ user.name ?? 'Гость' }}
{{ data['key'] ?? config.default ?? 'fallback' }}
Диапазон
Диапазон
{# Создание последовательности #}
{% for i in 0..10 %}
{{ i }}
{% endfor %}
{% for letter in 'a'..'z' %}
{{ letter }}
{% endfor %}
Spread-оператор
Spread-оператор
{# Развёртывание массива в аргументы #}
{% set args = ['one', 'two'] %}
{{ myMacro(...args) }}
{# Объединение массивов #}
{% set merged = [...array1, ...array2, 'extra'] %}
{# Развёртывание хеша #}
{% set defaults = {class: 'btn', type: 'button'} %}
{% set attrs = {...defaults, id: 'submit'} %}
Управление пробелами
Управление пробелами
{# Удаление пробелов с помощью дефиса #}
{%- if active -%}
Активен
{%- endif -%}
{# Удаление переносов строк с помощью тильды #}
{%~ if active ~%}
Активен
{%~ endif ~%}
{# Можно комбинировать с разделителями вывода #}
{{- variable -}}
| Символ | Позиция | Действие |
|---|---|---|
- | Слева ({%-) | Удаляет пробелы перед тегом |
- | Справа (-%}) | Удаляет пробелы после тега |
~ | Слева ({%~) | Удаляет только переносы строк перед тегом |
~ | Справа (~%}) | Удаляет только переносы строк после тега |
Именованные аргументы
Именованные аргументы
{# Фильтры с именованными аргументами #}
{{ 'hello'|replace({'h': 'H'}) }}
{{ number|number_format(decimals: 2, decimal_point: ',', thousands_separator: ' ') }}
{# Функции с именованными аргументами #}
{{ include('@common/card.html.twig', with_context: false) }}