twig变量输出使用{{ }}语法,自动html转义防xss;支持变量、对象属性、数组元素及链式访问;空值安全返回null;需原样输出html时用|raw过滤器。

Twig变量输出非常直接,核心就是用双大括号 {{ }} 包裹变量名。它不是简单“打印”,而是经过安全处理的动态内容插入——默认自动HTML转义,防XSS,这点和原生PHP的echo有本质区别。
基础变量输出:{{ variable }}
控制器传入的数据(字符串、数字、数组、对象)在模板里统一用{{ }}输出:
-
{{ name }}→ 输出传递的$name值,如"Alice" -
{{ price }}→ 输出数字99.9,不加引号也不格式化 -
{{ user.email }}→ 访问对象属性,等价于$user->getEmail()或$user['email'] -
{{ items[0].title }}→ 支持链式访问,自动跳过不存在的层级,最终返回null(不报错)
数组与对象访问的细节逻辑
Twig对{{ foo.bar }}的解析是智能的,按顺序尝试:
- 如果
foo是数组,查键'bar' - 如果是对象,先查公共属性
->bar - 再查方法
bar(),然后getBar(),最后isBar() - 全部失败才返回
null
而{{ foo['bar'] }}更严格:只适用于数组,不支持对象方法调用。
安全与转义:默认就防XSS
Twig默认对所有{{ variable }}内容执行htmlspecialchars()等效处理:
- 若
$content = '<script>alert(1)</script>',写{{ content }}会原样输出为文本,不会执行脚本 - 只有明确信任的内容才用
|raw过滤器:{{ html_content|raw }}(务必确保已用HtmlPurifier清洗过) - Symfony项目中,该行为由
twig.yaml里的autoescape: html控制,不建议关闭
实用技巧:换行、空值、注释
日常高频需求有现成方案:
- 含换行符的文本?加
|nl2br:{{ description|nl2br }} - 变量可能为空?用
|default设兜底:{{ user.nickname|default('游客') }} - 写说明但不想渲染?用
{# 注释内容 #},支持多行 - 想临时赋值?用
{% set temp = 'hello' %},后续可用{{ temp }}











