唯一可靠方式是设 cache: false(yaml 布尔字面量),因 twig 将其识别为禁用缓存;设 null、~ 或空字符串会被合并为默认路径 %kernel.cache_dir%/twig 而启用文件缓存,且必须同时确保 auto_reload: true 生效。

直接关掉 Twig 模板缓存,唯一可靠方式是设 cache: false(YAML 布尔字面量),不是字符串 "false",也不是 null 或 ~。
为什么 cache: false 是唯一生效写法
Twig 的 cache 配置项本质是一个路径,Symfony 会尝试把编译后的模板写入该路径。当设为 false(YAML 布尔值)时,Twig 引擎识别为“禁用缓存”,跳过写入逻辑;设为 null、~ 或空字符串会被容器合并回默认路径 %kernel.cache_dir%/twig,结果反而启用文件缓存。
-
cache: false→ Twig 不创建缓存文件,每次请求重新解析 .twig -
cache: null或cache: ~→ 实际等价于cache: "%kernel.cache_dir%/twig",目录存在就写入 -
cache: ""(空字符串)→ 同样被转成默认路径,不生效
必须同时确认 auto_reload: true
即使 cache: false 生效,若 auto_reload 关闭,Twig 不会监听文件变更,改完模板也不会触发重解析——看起来像“没生效”。该选项默认为 true,但某些自定义 Twig 环境(如单独配的 email_twig)可能未继承,需显式检查。
- 在
app/config/config_dev.yml中查twig:下是否有auto_reload: true - 若用了多个 Twig 实例(如
templating+email_twig),每个都要单独配cache: false和auto_reload: true - 运行
php bin/console debug:container --parameter=twig.options,输出中确认cache是false(不是null或路径字符串)
验证是否真关掉了:删目录 + 刷新 + 看文件
关缓存不是看配置写了没,而是看它有没有实际行为。最直白的验证方式:
- 手动删掉
var/cache/dev/twig/目录(如果存在) - 改一个模板文件,比如在
base.html.twig里加个注释 - 刷新页面,再检查
var/cache/dev/twig/是否有新文件生成 - 没有新文件 → 关成功;有文件 → 还在缓存,回头检查配置写法或环境是否真是
dev
注意:PHPStorm 默认开启 “safe write”,保存时先写临时文件再替换原文件,Twig 可能监听不到变更——可在 IDE 设置里关掉 “safe write”。
Docker 和时区问题常被忽略
在 Docker 环境下,即使配置全对,也可能因两个细节导致缓存“误启用”:
-
var/cache目录在容器内不可写 → Twig 回退到内存缓存(ArrayAdapter),表现像“部分生效”,但实际没落地文件 - 宿主机和容器时区不一致 →
filemtime()返回时间偏差,Twig 判断模板“未更新”,继续用旧编译结果
建议在容器启动脚本里加 date 对比,并确保 var/cache 挂载为可写卷,权限设为 775 或更宽松(调试期)。











