Перейти к основному содержимому

Синтаксис и операторы

Разделители​

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) }}