必须显式配置cache: false,因yaml中null、~或注释均被合并为默认缓存路径,仅布尔false被twig识别为禁用;多twig实例需各自配置,ci中须断言twig.options.cache为false。

必须在 config/packages/twig.yaml 或 config/config_dev.yml 中显式写死 cache: false,否则改了模板也不会实时生效——debug: true 和 APP_ENV=dev 都不自动关闭 Twig 缓存。
为什么 cache: false 必须显式写,不能留空或注释掉
Twig 的 cache 配置项不是布尔开关,而是一个路径。YAML 中的 ~、null、空字符串 "",甚至注释掉该行,都会被 Symfony 合并为默认值 %kernel.cache_dir%/twig,也就是实际启用缓存。
-
cache: false是唯一被 Twig 引擎识别为“禁用缓存”的字面量(注意是 YAML 的布尔false,不是字符串"false") - 设成
cache: null或cache:(冒号后无值)等同于未配置,Twig 会 fallback 到默认路径 - 若项目用了多个 Twig 实例(如 email 渲染单独配了
email_twig),每个都要单独加cache: false
怎么验证 cache: false 真生效了
关掉缓存不是看有没有报错,而是看它是否停止写入编译文件、是否响应文件变更。
- 删掉
var/cache/dev/twig/目录,刷新页面;如果目录里**没生成新 PHP 文件**,说明缓存已禁用 - 检查响应头:访问任意含 Twig 渲染的页面(如
/_profiler),执行curl -I http://localhost/_profiler | grep Last-Modified;若返回非空,说明auto_reload: true生效且缓存已关(Twig 正监听文件修改) - 若仍看到
var/cache/dev/twig/abc123.php类似文件生成,说明配置未加载或被其他配置覆盖(比如config/packages/prod/twig.yaml错误地被 dev 环境加载)
常见踩坑点:明明写了 cache: false 却还是不生效
问题往往不在配置本身,而在环境加载链或运行时干扰。
- IDE(如 PHPStorm)启用了 “safe write”,保存时先写临时文件再原子替换,Twig 的
filemtime()检测不到变更 → 关掉 IDE 的 safe write 选项 - Docker 环境中
var/cache卷权限不对,或宿主机与容器时区不一致,导致filemtime()返回时间异常,Twig 误判文件未更新 - 启动命令漏了
--env=dev,例如用php bin/console server:run但没指定环境,fallback 到prod,而 prod 下cache: true是硬编码逻辑 - 有人手动执行过
cache:clear但没加--env=dev,清掉了 dev 缓存目录,Twig 回退到内存ArrayCache,表现像“部分生效”
真正麻烦的不是写不出那行配置,而是团队里有人改了 base.html.twig 却发现队友页面没变——因为对方机器上 var/cache/dev/twig/ 里还躺着上周编译的 PHP 文件。把 cache: false 写进版本控制的配置,并在 CI 中用 php bin/console debug:container --parameter=twig.options 断言它的值,比每次问“你清缓存了吗”可靠得多。











