必须在twig.yaml中显式配置cache: false,不能留空、注释或设为null;该布尔值禁用模板缓存,配合auto_reload: true才能实现修改即生效。

twig.yaml 里必须写 cache: false,不是留空、注释或设为 null
很多人以为只要 APP_DEBUG=true 就自动禁用 Twig 缓存,其实完全不是。Symfony 的 debug 开关只影响错误显示和 Profiler,Twig 缓存由自身引擎控制,默认在 dev 下仍启用。真正生效的唯一方式是在 config/packages/twig.yaml 中显式写死:
twig:<br> cache: false这个
false 是 YAML 布尔字面量,不能加引号,也不能写成 "false" 或 ~——后者会被 Symfony 合并为默认路径,缓存照常生成。
验证是否真的不生成缓存文件:盯住 var/cache/dev/twig/ 目录
改完配置后,手动删掉 var/cache/dev/twig/ 整个目录,再刷新页面。如果目录保持为空、没新 PHP 文件生成,说明关成功了。常见失败点包括:
- IDE(如 PHPStorm)启用了“safe write”,保存时先写临时文件再替换,Twig 检测不到
filemtime()变更 —— 关掉 IDE 设置里的safe write - Docker 环境下
var/cache卷不可写,或宿主机与容器时区不一致,导致filemtime()判断失效 - Windows 下长路径或杀毒软件锁住了
var/cache/dev/twig/,报file_put_contents(): Permission denied
多人协作时,cache: false 必须写死在 config_dev.yml,不能靠环境推断
Symfony 3 的环境机制不保证模板缓存行为完全隔离。实际运行可能因以下原因悄悄 fallback 到 prod 模式:
-
php bin/console server:run没加--env=dev,默认走 prod - CI 流水线中
APP_ENV被覆盖,或cache:clear忘记指定--env=dev,清掉 dev 缓存后 Twig 回退到内存缓存(ArrayCache) - 有人本地改了
APP_ENV=prod测试性能,却忘了切回来,模板就一直从缓存读旧编译结果
所以团队规范必须是:所有 dev 配置文件(尤其是 app/config/config_dev.yml)里明确写 cache: false,CI 脚本还要跑 php bin/console debug:container --parameter=twig.options 断言输出中 cache 值确实是 false。
关掉缓存后,auto_reload: true 才有意义
cache: false 和 auto_reload: true 是一对组合。前者让 Twig 每次都重新解析 .twig 源文件,后者确保它真去检查文件是否被修改过。虽然 auto_reload 默认为 true,但如果你在自定义 Twig 实例(比如单独配了个 email_twig)里漏了这行,即使 cache: false,它也不会自动响应保存动作。检查方式很简单:改一个模板,刷新,看页面是否立刻变化 —— 不变,八成是 auto_reload 没生效或被覆盖。


















