Русскоязычная документация по Twig - PHP шаблонизатору. Руководство по Твиг на русском языке
Макросы сопоставимы с функциями в регулярных языках программирования. Они используются, чтобы положить часто используемые HTML идиомы в многократно используемые элементы с целью избежать постоянных повторений. Вот небольшой пример макроса, который делает элемент form.
{% macro input(name, value, type, size) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}
Макросы отличается от родных функций PHP в нескольких направлениях.
Но, как и PHP-функции, макросы не имеют доступа к глобальным переменным шаблона.
Вы можете передать весь контекст в качестве аргумента, используя специальную переменную _context.
Макрос может быть определен в любой шаблон, и должен быть "импортирован" перед использованием (см. документацию для тега import для получения дополнительной информации).
{% import "forms.html" as forms %}
Вызов import импортирует файл "forms.html", который может содержать только
макросы или шаблон и некоторые макросы, и может импортировать функици как
переменные form.
Макрос можно вызывать по желанию:
<p>{{ forms.input('username') }}</p>
<p>{{ forms.input('password', null, 'password') }}</p>
Если макросы определяются и используются в том же шаблоне, то можно использовать специальную переменную _self , чтобы импортировать их:
{% import _self as forms %}
<p>{{ forms.input('username') }}</p>
При определении макроса в шаблоне, где его планируют использовать, можно попытаться вызвать макрос непосредственно через _self.input ( ) вместо его импорта; даже если это работает сейчас - это всего лишь побочный эффект текущей реализации, и больше не будет работать в Twig 2.x.
Если макрос должен использоваться в другом макросе из того же файла, его нужно импортировать локально:
{% macro input(name, value, type, size) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}
{% macro wrapped_input(name, value, type, size) %}
{% import _self as forms %}
<div class="field">
{{ forms.input(name, value, type, size) }}
</div>
{% endmacro %}