必须在配置文件中显式设置cache: false,因debug: true和APP_ENV=dev不自动禁用Twig模板缓存;Twig默认全环境启用编译缓存,cache: false是唯一可靠禁用方式,需逐个Twig实例配置并验证缓存目录是否停写。

必须在 config/packages/twig.yaml 或 config_dev.yml 中显式写死 cache: false,否则改完模板刷新没反应——这不是环境没切对,是 Twig 缓存根本没关掉。
为什么 debug: true 和 APP_ENV=dev 都不等于模板不缓存
Symfony 的 debug 控制的是 Profiler、错误堆栈、容器热加载等,和 Twig 模板缓存完全解耦。Twig 默认在所有环境下都启用编译缓存(哪怕 dev),只是路径不同:var/cache/dev/twig/ 下一堆 abc123.php 文件就是证据。你看到“开发模式”,不代表 Twig 正在实时解析 .twig 文件。
-
cache: false是唯一能禁用 Twig 编译缓存的配置值;设为null、~、空字符串或注释掉,都会 fallback 到默认路径 - 如果用了多个 Twig 实例(比如
email_twig),每个都要单独配cache: false - Docker 环境下,
var/cache目录必须可写,且宿主机与容器时区一致,否则filemtime()返回时间异常,auto_reload可能失效
怎么验证 cache: false 真生效了
别只看页面有没有变,要确认缓存文件是否停写。最直接的办法:删掉 var/cache/dev/twig/,改一个模板,刷新页面,再检查该目录是否生成新文件。
- 如果目录保持为空 → 关成功了
- 如果出现新
.php文件 → 配置没生效,检查是不是写在了错误的配置文件里(比如误配到prod配置块) - 用
php bin/console debug:container --parameter=twig.options查输出中"cache" => false是否明确存在,不是null或路径字符串
常见踩坑点:IDE 安全写入、权限锁、CI 无断言
PHPStorm 默认开启 “safe write”:保存时先写临时文件再原子替换,Twig 的文件监听器(auto_reload)可能收不到变更事件,导致你以为改了但没生效。
- 关闭方法:Settings → Appearance & Behavior → System Settings → Use "safe write" → 取消勾选
- Windows 下杀毒软件或 OneDrive 可能锁定
var/cache/dev/twig/,报file_put_contents(): Permission denied,需临时退出或加白名单 - CI 流水线里不验证
twig.options.cache === false,就等于把缓存策略交给运气——本地 OK 的配置,上线后可能因构建环境差异悄悄启用缓存
真正麻烦的不是配置难,而是缓存行为不可见。你改了 base.html.twig,队友刷新看到旧内容,没人知道是自己机器漏配、CI 覆盖了配置,还是 Docker 卷权限错了。把 cache: false 写进版本控制的 YAML,再让 CI grep -q '"cache" => false' 一下 debug 输出,比每次问“你清缓存了吗”靠谱得多。


















