symfony 3 twig 模板热更新失效的主因是环境非 dev 或缓存未清:需确认 app_env=dev、清空 var/cache/dev/twig/、检查 twig.yaml 中 cache 是否为 false,并强制刷新浏览器。

Symfony 3 的 Twig 模板在开发环境默认是“热更新”的,但如果你改了 templates/ 下的文件,刷新页面却没变化,问题大概率不在模板缓存本身,而是 Symfony 整体缓存机制或开发服务器未生效。
确认当前是否处于 dev 环境
Symfony 只有在 dev 环境下才默认禁用 Twig 编译缓存;如果误用了 prod 环境启动(比如通过 php -S 时没设 APP_ENV=dev),Twig 就会缓存编译后的 PHP 文件,导致改了 Twig 模板也不生效。
- 检查
.env文件里APP_ENV是否为dev - 启动服务时显式指定:
APP_ENV=dev php -S localhost:8000 -t public(Linux/macOS)或set APP_ENV=dev && php -S localhost:8000 -t public(Windows) - 访问
/_profiler查看右上角环境标识,必须显示dev
清空 Twig 编译缓存目录
Twig 编译后的 PHP 文件存在 var/cache/dev/twig/(或 var/cache/prod/twig/),即使环境正确,该目录若残留旧文件,仍会加载过期版本。
- 手动删除:
rm -rf var/cache/dev/twig/(Linux/macOS)或del /s /q var\cache\dev\twig\(Windows) - 更稳妥:执行
php bin/console cache:clear --env=dev,它会连带清掉 Twig 编译缓存 - 注意:不要只删
var/cache/dev/下的annotations或doctrine子目录,Twig 缓存是独立路径
检查 Twig 配置是否被覆盖
虽然 Symfony 3 默认在 dev 环境关闭 cache,但如果你在 config/packages/twig.yaml 或 config/packages/dev/twig.yaml 中显式写了 cache: '%kernel.cache_dir%/twig',就等于启用了缓存 —— 即使路径指向缓存目录,Twig 也会复用编译结果。
- 检查配置中是否存在
cache:行;若存在且值非false,请删掉或改为cache: false - 确认没有在
services.yaml中重定义twig.loader.filesystem并附加缓存层 - 运行
php bin/console debug:config twig,查看输出中cache项是否为false(dev环境下应如此)
浏览器与 Web Server 层干扰
有时你以为是模板没更新,其实是浏览器缓存了 HTML,或者 PHP 内置服务器没监听到文件变更。
- 强制刷新页面:按
Ctrl+Shift+R(Windows/Linux)或Cmd+Shift+R(macOS)绕过浏览器缓存 - 检查响应头:在浏览器开发者工具 Network 标签页里看
Cache-Control是否含max-age=0或no-cache - 换端口重启服务器:
php -S localhost:8001 -t public,排除旧进程残留
真正要关的不是“模板缓存”,而是确保整个链路——环境变量、缓存目录、Twig 配置、HTTP 响应——都落在 dev 的预期行为上。最容易被忽略的是 APP_ENV 被意外覆盖,或 cache:clear 后忘了重启 PHP 内置服务器。











