symfony 5+强制twig模板统一放在templates/目录下,为第一顺位查找路径;邮件模板建议放templates/emails/,错误页必须为templates/bundles/twigbundle/exception/下对应命名的.html.twig文件。

Twig模板默认放在templates/目录下
Symfony 5+(及现代结构项目)强制要求所有 Twig 模板统一放在templates/根目录下,不再支持旧版 Bundle 内的Resources/views/路径。这个目录是 Twig 加载器的**第一顺位查找路径**,也是官方推荐且最简配置就能生效的位置。
- 控制器中调用
render('about.html.twig')时,Twig 会自动在templates/about.html.twig找文件 - 邮件模板、错误页、静态页面——只要用 Twig 渲染,都优先从这里加载
- 若同时存在
templates/base.html.twig和app/Resources/views/base.html.twig(旧结构残留),前者始终优先生效 - 不建议手动改 Twig 加载器路径;修改
twig.paths参数容易导致debug:twig命令结果与实际不符
邮件模板必须放在templates/emails/子目录
这不是硬性限制,但属于组织规范:邮件内容需结构化、可继承、响应式兼容,单独归类能避免和页面模板混用。关键在于TemplatedEmail::htmlTemplate()方法接收的路径是相对于templates/的,所以写'emails/welcome.html.twig'就对应templates/emails/welcome.html.twig。
-
emails/welcome.html.twig→ HTML 版本 -
emails/welcome.txt.twig→ 纯文本备选(部分邮件客户端或无障碍场景需要) -
emails/base.html.twig→ 所有邮件共用的基础布局,含内联样式、通用页眉页脚 - 别把邮件模板扔进
templates/bundles/TwigBundle/Exception/——那地方只管错误页,不参与邮件渲染
生产环境自定义错误页必须放templates/bundles/TwigBundle/Exception/
TwigBundle 的错误页匹配逻辑是路径敏感的:它**只认这个固定路径**,且严格按 HTTP 状态码命名。放在templates/error404.html.twig或templates/errors/404.html.twig都不会被自动识别。
- 正确路径:
templates/bundles/TwigBundle/Exception/error404.html.twig - 支持的命名:
error404.html.twig、error500.html.twig、error.html.twig(兜底) - 扩展名必须是
.html.twig;error404.json.twig不会触发自动匹配 - 改完必须运行
bin/console cache:clear --env=prod,否则即使路径对也无效
静态页面模板位置取决于你用什么方式渲染
如果用FrameworkBundle:Template:template控制器(如路由path: /privacy绑定到FrameworkBundle:Template:template并传template: privacy.html.twig),那么模板必须在templates/下,且路径就是templates/privacy.html.twig。
- 不能写成
@App/privacy.html.twig——现代 Symfony 默认不启用 Bundle 命名空间解析 - 该方式不支持传参;若需动态数据,必须写真实控制器
- 如果你在控制器里用
$this->render('blog/post.html.twig'),那它找的就是templates/blog/post.html.twig - 路径层级纯靠目录组织,无隐含约定;
templates/pages/、templates/components/这类子目录完全合法,只要路径写对
bin/console debug:twig看 Twig 实际加载的是哪个路径,比猜快得多。











