twig宏是封装可复用html片段的模板函数,需在模板中用{% macro %}定义,通过import或from...import导入调用,作用域限于当前模板且需手动转义输出。

宏的定义方式
Twig宏类似函数,用于封装可复用的HTML片段。它必须写在模板文件里,用{% macro %}标签包裹。
基本语法:
- 每个参数可设默认值,比如
type="text" - 参数名后不加类型声明,也不需
$符号 - 宏内不能直接访问模板变量,除非显式传入
_context
示例:定义一个通用输入框宏
{% macro input(name, value, type="text", size=20) %}
<input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" size="{{ size }}">
{% endmacro %}
宏的导入与调用
宏定义后不能跨模板自动生效,必须导入才能使用。有两种主流方式:
- import:把整个模板的宏作为命名空间引入,适合多个宏共用
- from ... import:只导入指定宏,更轻量、更清晰
用法示例:
{% import "forms.html" as forms %}
<p>{{ forms.input('username') }}</p>
{% from 'forms.html' import input as input_field %}
<p>{{ input_field('password', '', 'password') }}</p>
宏的作用域规则
宏不是全局可用的,它的可见性有明确边界:
- 导入后只在当前模板生效,子模板或
{% include %}包含的模板中不可用 - 在
{% block %}内导入的宏,仅限该区块内使用 - 在
{% embed %}内部需重新导入,不能继承外层宏
如果想在多个地方复用,建议统一放在单独的macros.html.twig中,再按需导入。
实用技巧与注意事项
写宏时容易忽略但很关键的点:
- 输出内容要手动转义,比如
{{ value|e }},避免XSS风险 - 宏名不能和内置函数、过滤器重名,否则可能被覆盖
- 不支持返回值,只能渲染输出;如需逻辑处理,应放在控制器或自定义扩展中
- 调试时可在宏内加
{{ dump(_context) }}查看传入数据(需开启debug)











