Twig 缓存必须设为 YAML 布尔值 cache: false 才真正关闭,同时需确保 auto_reload: true 以响应模板变更;该配置须在 dev 环境的 twig.yaml 中显式声明且不被覆盖。

twig.cache: false 是唯一生效的关闭方式
设成 null、~ 或留空,Symfony 会 fallback 到默认路径(如 %kernel.cache_dir%/twig),实际仍启用缓存;写成字符串 "false" 是无效的 YAML 字面量,会被当路径处理。必须用 YAML 原生布尔值:cache: false。
这个配置要落在 config/packages/twig.yaml 或 config/packages/dev/twig.yaml 中,且不能被其他环境配置覆盖。若项目用了多套 Twig 实例(比如 email 模板单独配了 email_twig),每个实例都得单独加这一行。
必须同时确认 auto_reload: true
关掉缓存只是让 Twig 不再复用编译后的 PHP 文件,但不等于它能自动感知文件改动——这由 auto_reload 控制。默认是 true,但以下情况可能被覆盖:
-
config/packages/twig.yaml里显式写了auto_reload: false - 某些旧版 Bundle 或自定义扩展在容器编译时强制重置了该选项
- Docker 容器挂载时文件系统 inotify 事件不可用(尤其 on macOS/Windows),导致监听失效
验证方法:改一个模板后刷新页面,再执行 ls -l var/cache/dev/twig/ —— 如果目录为空或没新增文件,且页面内容已更新,说明两者都生效了。
别信 APP_ENV=dev 就自动关缓存
Symfony 3 的环境变量只影响部分行为,Twig 缓存开关是独立控制的。常见破环点包括:
-
php bin/console server:run启动时没加--env=dev,实际跑在prod环境,而prod下cache: true是硬编码逻辑 -
.env文件里APP_ENV=dev但APP_DEBUG=false,某些 Twig 扩展会据此降级行为 - IDE 自动保存触发“安全写入”(先写 tmp 再 mv),导致
filemtime()检查失败,auto_reload认为文件没变
最稳做法:在 config/packages/dev/twig.yaml 里固定写死 cache: false 和 auto_reload: true,不依赖任何外部判断。
CI 流水线里必须断言 cache 值为 false
本地配对了不代表队友或 CI 也一致。应在构建脚本中加入两道检查:
- 运行
php bin/console debug:container --parameter=twig.options,grep 输出是否含"cache" => false(注意不是null或路径字符串) - 用
curl -s -I http://localhost/_profiler | grep Last-Modified,有该响应头才说明 Twig 正在监听文件变更
真正麻烦的不是配不配得对,而是有人改了 base.html.twig 却发现队友的机器还在读 var/cache/dev/twig/abc123.php —— 那个文件可能一周前就生成了,连 cache:clear 都不一定清掉它,除非你确定 cache: false 已生效。











