twig变量输出用{{ variable }},支持点号访问对象属性(如{{ user.name }})和方括号访问数组(如{{ items[0] }});空值需用|default或??防御;html转义默认开启,可信内容才可用|raw。

Twig 中怎么输出变量值
直接用 {{ variable }} 语法就能输出,但实际用的时候常因变量结构、空值或转义规则出问题。
- 基础变量(如字符串、数字):直接写
{{ name }},Twig 会自动 HTML 转义 - 对象属性:用点号访问,比如
{{ user.name }},等价于 PHP 的$user->getName()或$user['name'](Twig 自动适配) - 数组/索引访问:用方括号,如
{{ items[0] }}或{{ data['key'] }} - 嵌套太深或不确定是否存在时,别硬写
{{ user.profile.address.city }}——可能报Key "profile" for array with keys "id, name" does not exist
变量为空或未定义时怎么安全输出
Twig 默认对未定义变量抛异常(开发环境),线上可能静默失败。必须主动防御。
- 用
|default过滤器兜底:{{ user.email|default('no email') }} - 链式访问加
??空合并操作符(Twig 2.10+):{{ user.profile?.address?.city ?? 'N/A' }},遇到 null 就停,不报错 - 老版本没
???改用is defined判断:{% if user.profile is defined and user.profile.address is defined %}{{ user.profile.address.city }}{% endif %} - 注意:
|default对false、0、空字符串也生效,不是只管null—— 如果要区分“假值”和“未定义”,得用is defined显式判断
怎么禁用 HTML 转义(比如输出带标签的内容)
默认转义是安全机制,但富文本、SVG 或已信任的 HTML 字段需要原样输出。
- 加
|raw过滤器:{{ article.content|raw }} - 必须确保
article.content来源可信(比如后台管理员输入、非用户直填),否则 XSS 风险极高 - 别滥用:
{{ user_input|raw }}是典型错误,应优先用striptags或白名单过滤后再输出 - 如果只是想换行变
<br>,用|nl2br更安全:{{ description|nl2br }}
Symfony Controller 传参到 Twig 的常见陷阱
Controller 里传的变量名,就是模板里 {{ xxx }} 的 xxx,但命名和结构容易翻车。
- 别在 Controller 里传整个 Entity 实例(如
$this->render('page.html.twig', ['user' => $user])),除非你明确知道 Twig 会调哪些 getter —— 它可能意外触发数据库查询(如 N+1) - 推荐显式传 DTO 或数组:
['user_name' => $user->getName(), 'user_email' => $user->getEmail()] - 用
dump()查看变量结构(开发环境开启 WebProfiler):{{ dump(user) }},但上线前务必删掉 - 数组键名含点号(如
'api.response.status')会被 Twig 解析成嵌套,传之前重命名或改用下划线











