必须显式设cache: false,否则twig仍会写入var/cache/dev/twig;验证需检查该目录是否为空,并用debug:container确认输出中"cache": false(非null、非字符串),且auto_reload: true已启用。

必须显式设 cache: false,否则即使 APP_ENV=dev 且 debug=true,Twig 仍会写入 var/cache/dev/twig/ 下的 PHP 文件——改了模板却没反应,八成是这个配置漏了。
如何确认 Twig 模板缓存真被关闭了
别信“我在 dev 环境”,得看实际行为:访问任意 Twig 渲染页面后,立刻检查 var/cache/dev/twig/ 目录是否为空或根本没生成新文件;同时用 php bin/console debug:container --parameter=twig.options 查输出里的 cache 值——它必须是 false(不是 null、不是字符串 "false"、更不能是路径)。
- 若看到类似
"cache": "/var/www/project/var/cache/dev/twig",说明缓存仍在工作,哪怕目录权限不对也属于“启用但写失败”,行为不可靠 - 若输出为
"cache": null,代表配置未生效或被更高优先级覆盖(比如config/packages/twig.yaml被config_dev.yml覆盖) - Windows 用户额外检查杀毒软件是否锁定
var/cache目录,file_put_contents(): Permission denied错误常被误判为“缓存关不掉”
关闭缓存必须配 auto_reload: true
cache: false 只是停写编译文件,但若 auto_reload 关了,Twig 就不会每次请求都重新读取 .twig 源文件——你保存了,它也不重解析。这个选项默认开启,但某些 IDE 插件或自定义配置可能悄悄关掉它。
- 在
config/packages/twig.yaml或config_dev.yml中显式声明:auto_reload: true - 验证方式:修改一个基础模板(如
base.html.twig),刷新页面,观察变化是否即时;再临时把auto_reload改成false,会发现改完保存完全没反应 - 注意:该选项仅在
debug: true时有意义,prod 下强制忽略
为什么不能只注释掉 cache 配置项
YAML 里留空、注释掉、或写成 cache: "",Twig 都会 fallback 到默认行为——即使用 %kernel.cache_dir%/twig。而这个路径在 cache:warmup 后必然存在,结果就是缓存照常启用。
- 正确写法只有两种:
cache: false(YAML 布尔字面量),或cache: ~(null,但需确保无其他配置覆盖) - 推荐前者:
cache: false更明确,CI 脚本能直接断言字符串匹配,避免歧义 - 绝对不要用
cache: "%kernel.cache_dir%/twig"这类动态路径——不同机器上%kernel.cache_dir%可能指向不同位置,且 Docker 容器内路径映射易出错
真正麻烦的是缓存没关干净时的“部分生效”现象:比如 base.html.twig 更新了,但某个继承它的 user/show.html.twig 还在读旧编译文件——这不是 Twig 的 bug,而是配置没压到最底层。把 cache: false 和 auto_reload: true 写死在 config/packages/twig.yaml,比在每个环境配置里修修补补更可靠。











