必须在config/packages/twig.yaml中显式配置cache: false(YAML布尔值),而非config_dev.yml;同时确保auto_reload: true生效,验证方式为var/cache/dev/twig/目录存在但完全为空且无新PHP文件生成。

cache: false 必须写在 config/packages/twig.yaml 里
很多人在 config_dev.yml 里改 cache: false,但 Symfony 3.4+ 的配置加载顺序会让它被 config/packages/twig.yaml 覆盖。最终生效的是后者,不是环境配置文件。
正确做法是打开 config/packages/twig.yaml,确保包含以下内容:
twig:
default_path: '%kernel.project_dir%/templates'
debug: '%kernel.debug%'
strict_variables: '%kernel.debug%'
cache: false
注意三点:
-
cache: false是 YAML 布尔字面量,不能写成cache: "false"(字符串)或cache: ~(null) - 删掉任何类似
cache: '%kernel.cache_dir%/twig'的路径配置,哪怕它在注释里也不行——某些旧模板加载器会 fallback 到它 - 如果项目用了
framework.twig配置块(比如在config.yml里),必须把它迁移到twig.yaml,否则 twig.options 不会被正确合并
验证 auto_reload 是否真起作用
关掉缓存只是第一步;auto_reload: true 才决定你保存 .twig 文件后页面是否立刻更新。它默认开启,但容易被覆盖或静默失效。
检查方式:
- 运行
php bin/console debug:container --parameter=twig.options,输出中必须有"auto_reload": true - 修改任意一个模板(如
base.html.twig),保存后刷新页面——如果没变化,不是浏览器缓存,而是auto_reload没生效 - Windows 下尤其要注意:杀毒软件或 OneDrive 可能锁住
var/cache/dev/twig/目录,导致 Twig 回退到内存缓存(ArrayCache),表现就是“关了缓存却没反应”
别信 var/cache/dev/twig/ 是否为空
很多人手动删掉 var/cache/dev/twig/ 目录,以为这就关了缓存。其实没用——只要 cache 配置不是 false,Twig 会在下次请求时自动重建它,且内容还是旧的。
真正有效的验证方式是:
- 确认
var/cache/dev/twig/目录存在但**完全空着**(连子目录都没有) - 访问一个模板页面,然后立刻执行
ls -la var/cache/dev/twig/—— 如果出现新文件(如abc123.php),说明cache: false没生效 - 更可靠的做法是加一行日志:在
src/Kernel.php的configureContainer()里临时插入dump($container->getParameter('twig.options'));,看cache值是不是布尔false
CI 流水线里必须断言 cache 值为 false
本地配对了不等于队友或 CI 也对。常见破环点包括:APP_ENV=prod 被 Docker 环境变量覆盖、有人提交了带 cache: '%kernel.cache_dir%/twig' 的 PR、CI 使用了旧版缓存 warmup 脚本。
在 CI 的测试阶段加两行检查:
php bin/console debug:container --parameter=twig.options 2>/dev/null | grep -q '\"cache\":false'-
curl -s -I http://localhost:8000/_profiler | grep -q "Last-Modified"—— 若缺失该 header,说明 Twig 没监听文件变更,auto_reload失效
真正麻烦的不是配置难,而是改完模板后,一半人看到新内容,另一半人还在读编译过的旧 PHP 文件。把 cache: false 锁死在 twig.yaml,再让 CI 抓住它,比每次问“你清缓存了吗”强得多。


















