必须在 config_dev.yml 中显式设 cache: false,因为 Twig 缓存开关与 Symfony debug 模式解耦,debug=true 不影响 twig.cache 默认路径,仅 cache: false(YAML 布尔值)才能禁用缓存并配合 auto_reload: true 实时读源文件。

必须在 config_dev.yml 中显式设 cache: false,仅靠 APP_ENV=dev 或 debug=true 无法保证 Twig 模板不缓存。
为什么 cache: false 必须写死在 config_dev.yml
Twig 的缓存开关和 Symfony 的 debug 模式是解耦的。debug=true 只影响 Profiler、错误页面、容器热加载等,twig.cache 默认仍指向 %kernel.cache_dir%/twig —— 这个目录在首次请求或 cache:warmup 后会被创建,模板编译结果就落在这里,后续修改 base.html.twig 就不会生效。
-
cache: ~(YAML null)会被 Twig 解析为默认路径,实际启用缓存 -
cache: "false"(字符串)会被当成路径名,Twig 尝试去写入名为false的子目录,往往失败但行为不可控 - 只有 YAML 字面量
cache: false才被 Twig 识别为“禁用缓存引擎”,强制走ArrayCache并配合auto_reload: true实时读源文件 - 避免使用
cache: "%kernel.cache_dir%/twig":不同开发者%kernel.cache_dir%路径不同,且该目录总能被创建,等于没关
auto_reload: true 不只是可选配置
关闭缓存后若没启用自动重载,Twig 会用内存中的旧模板副本,你改了文件也看不到变化——现象就是“明明关了缓存,刷新还是旧内容”。
- 该选项默认开启,但某些 IDE 插件、Docker Compose 覆盖环境变量或手动执行
php bin/console cache:clear --env=prod后再切回 dev,可能导致配置未重载 - 验证方式:访问任意 Twig 渲染页面,用
curl -I http://localhost/_profiler | grep Last-Modified,有响应头说明 auto_reload 生效;没有则需检查是否被覆盖或未加载 - 不要依赖“本地清一次缓存就一劳永逸”——多人协作中,别人机器上可能正从
/var/cache/dev/twig/xxx.php读旧编译结果
CI 流水线里必须断言两项事实
靠人写对配置不可靠,CI 必须自动拦截错误配置。
- 运行
php bin/console debug:container --parameter=twig.options,grep 输出中"cache":false(注意是布尔 false,不是null或路径字符串) - 启动内置服务器(
php bin/console server:run --env=dev &),用curl -s http://127.0.0.1:8000/_profiler | head -1确保能访问,再检查Last-Modified响应头是否存在 - 这两项缺一不可:前者防配置写错,后者防 runtime 环境被覆盖(比如某处误设
APP_ENV=prod)
真正麻烦的从来不是“怎么关”,而是有人改了模板却不知道队友的机器正在读一个上周生成的 .php 编译文件。把 cache: false 和 auto_reload: true 写死、加 CI 断言、禁用所有动态路径,比每次问“你清缓存了吗”少掉八成协作摩擦。


















