_context 是 twig 2.10+ 自动注入的只读全局变量,代表当前模板作用域的全部变量;旧版本不支持,macro 和 only 包含时受限,调试应优先用 dump(var) 或 is defined。

_context 不是“设置”出来的变量,它是 Twig 自动注入的只读全局变量,代表当前模板作用域下所有可用变量的完整集合。你不能用 {% set _context = ... %} 覆盖它,也不该手动传入——它由 Twig 引擎在渲染时自动构造。
为什么 _context 总是空或报错?
常见现象:在模板里写 {{ dump(_context) }} 却看不到预期变量,甚至抛出 Variable "_context" does not exist 错误。
- 最可能原因:
strict_variables: false(或未启用),但更常见的是你正在一个不支持_context的旧版 Twig 环境中——_context从 Twig 2.10+ 才稳定可用,Symfony 5.4+ 默认带的 Twig 版本才可靠支持 - 另一个高频坑:你在
{% macro %}内部直接访问_context,而 macro 是隔离作用域的,_context在 macro 里只包含 macro 自己的参数,不是外层模板的上下文 - 如果用了
include并加了only修饰(如{% include 'partial.html.twig' only %}),那被包含模板里_context就真的只有显式传入的变量,外层变量全被过滤掉了
_context 和手动传参、with 的区别
Twig 没有 with_context 或 with_context=true 这种配置项。所谓“with context”,其实是默认行为;你要刻意“去掉”才需要 only。
-
{% include 'foo.html.twig' %}→foo.html.twig能访问全部_context -
{% include 'foo.html.twig' with {'user': user} %}→foo.html.twig的_context只含user和 Twig 内置变量(如_self,_charset),不含原模板其他变量 -
{% include 'foo.html.twig' only %}→ 连内置变量都受限,_context仅含_self和_charset,其他全清空
替代 _context 的安全调试方式
如果你发现 _context 不可用或行为异常,别硬扛,换更稳的方案:
- 想看某个变量结构?直接
{{ dump(user) }},比{{ dump(_context) }}更精准,也避免因_context太大导致内存溢出 - 想确认变量是否传进来了?用
{% if user is defined %}{{ dump(user) }}{% endif %},比依赖_context更明确 - 在 macro 里要访问外层数据?显式传参:
{% import '_macros.html.twig' as macros %}{{ macros.render_item(item, user) }},而不是指望_context自动穿透 - 开发环境确认 Twig 版本:
php bin/console debug:twig --version,低于3.5建议升级,_context在低版本中行为不一致
真正容易被忽略的是:当你在 TemplatedEmail 或异步邮件任务里调试时,_context 看起来“少东西”,往往不是 Twig 问题,而是邮件模板没走标准 render() 流程,而是被 renderBlock() 或自定义渲染器绕过了上下文注入——这种场景下,老老实实用 context() 显式传参最可靠。











