twig 模板修改后无效果,是因为 symfony 3 在 debug=true 时仍会缓存编译后的模板,需手动清空 var/cache/dev/twig/ 目录或配置 twig.cache 为布尔值 false。

开发时改了 Twig 模板却看不到效果,不是代码没保存,而是 Symfony 3 在 debug=true 下仍会缓存编译后的模板——尤其当你误配了缓存适配器或没清干净 var/cache/dev/twig/ 目录时。
为什么 debug=true 还要手动清 Twig 缓存
Symfony 3 的 Twig 缓存行为受两层控制:一是 debug 配置开关,二是实际缓存后端是否启用。即使 debug: true,只要 twig.options.cache 指向了非 false 值(比如 %kernel.cache_dir%/twig),Twig 就会把模板编译成 PHP 文件并复用。
常见踩坑点:
-
config/packages/twig.yaml里写了cache: '%kernel.cache_dir%/twig',但没意识到这在 dev 环境下也生效 - 改完模板后只执行
cache:clear,却漏掉var/cache/dev/twig/目录本身权限异常(如被 root 写入过) - 用了自定义
cache.adapter.filesystem作为全局缓存驱动,意外让 Twig 编译器复用其路径
怎么确认 Twig 缓存真关了
别只信配置,直接看运行时行为:
- 打开
config/packages/twig.yaml,确保有这一行:cache: false(注意是布尔值false,不是字符串'false') - 检查
php bin/console debug:container --env=dev | grep twig,输出中twig.cache_warmer应该是 disabled;若看到twig.loader指向FilesystemLoader+ cache 路径,说明没关干净 - 临时加一句
{{ dump(_context) }}到模板里,刷新页面——如果报错 “dump() function does not exist”,说明 Twig 缓存还在用旧编译版本(因为dump是 DebugBundle 提供的,旧缓存里没加载)
清缓存不能只靠 cache:clear
cache:clear 命令默认只清容器、路由、事件监听器等缓存,var/cache/dev/twig/ 目录是 Twig 自己管的,不走 Symfony 主缓存系统。
- 手动删:
rm -rf var/cache/dev/twig/(Linux/macOS)或del /s /q var\cache\dev\twig\(Windows) - 加参数强制重建:
php bin/console cache:warmup --env=dev --no-debug,它会重新扫描所有模板并生成新缓存(注意:必须带--no-debug才会真正写入,否则跳过) - 如果项目用了
symfony/filesystem包且var/cache不可写,Twig 编译会静默失败——检查ls -ld var/cache,确保当前用户有写权限
模板改了但页面没变?先查这三处
有时问题根本不在缓存,而在更底层的加载链路:
- 控制器里用了
$this->render('old_name.html.twig'),但你改的是new_name.html.twig—— 检查渲染路径拼写和大小写(Linux 下敏感) - 模板继承了
{% extends 'base.html.twig' %},而你改的是子模板,但base.html.twig里有{% block content %}{% endblock %}为空,导致内容不显示 - 浏览器缓存了整个响应(尤其是 304 Not Modified),按
Ctrl+F5或禁用浏览器缓存重试,排除前端干扰
Twig 编译缓存本身不复杂,但容易和文件权限、路径配置、环境变量耦合。最稳的做法:设 cache: false + 手动删 var/cache/dev/twig/ + 重启 Web 服务器(哪怕用的是 php -S)。不要依赖“应该自动更新”。











