twig: cache: false 是唯一可靠关闭方式,需在 config_dev.yml 中配置并确保 auto_reload: true;多 twig 实例须各自设置,且需验证缓存目录是否为空。

twig.cache: false 是唯一生效的关闭方式
设成 null、~ 或空字符串 "" 都不生效 —— Symfony 会把它们合并为默认路径(如 %kernel.cache_dir%/twig),结果还是启用磁盘缓存。必须用 YAML 字面量 false,且写在 app/config/config_dev.yml 的 twig 配置块里:
twig:
cache: false
auto_reload: true
auto_reload: true 要显式保留(虽然 dev 下默认开启,但某些自定义环境或覆盖配置可能把它关掉)。没它,即使 cache: false 生效,Twig 也不会主动检查文件改动。
多个 Twig 环境都要单独关
如果你项目里有不止一个 Twig 实例(比如单独配了 email_twig 用于发信),那每个都得独立设置 cache: false。Symfony 不会全局继承这个配置,只作用于当前实例。
- 查所有 Twig 服务名:
php bin/console debug:container | grep twig - 每个匹配的服务(如
twig、email_twig)对应一个配置段,都要加cache: false - 改完记得清一次缓存:
php bin/console cache:clear --env=dev
验证是否真关掉了
别只看配置写了没,要动手验证:
- 删掉
var/cache/dev/twig/目录(如果存在) - 改一个模板文件,比如在
base.html.twig里加个<!-- test-{{ random() }} --> - 刷新页面,看源码里有没有新内容;再看
var/cache/dev/twig/是否仍为空 —— 空就说明关成功了 - 如果目录里生成了新 PHP 文件,说明配置没生效,回头检查 YAML 缩进和字面量写法
IDE 的“safe write”功能(如 PHPStorm 默认开启)会导致文件变更监听失败,建议在 IDE 设置里关掉它。
Docker 和时区问题常被忽略
用 Docker 开发时,两个细节极易导致“明明关了缓存却还读旧模板”:
-
var/cache目录必须挂载为可写卷,否则 Twig 回退到内存缓存(ArrayCache),表现像“部分生效” - 宿主机和容器时区不一致 →
filemtime()返回时间偏差 → Twig 判断模板“未更新”,跳过重编译
解决方法:Docker Compose 中加 environment: - TZ=Asia/Shanghai 并确保宿主机时区也一致,再验证 date 命令输出是否相同。











