Twig继承采用“一个母版,多个子页”模式,通过{% extends %}指定父模板、{% block %}替换局部内容;基础模板base.html.twig定义HTML骨架及title、stylesheets、content、javascripts等可重写区块;子模板如home.html.twig继承并填充各block;支持多级继承(如base-admin.html.twig)和动态模板选择(如基于请求类型或用户角色)。

Twig继承的核心是“一个母版,多个子页”,用 {% extends %} 指定父模板,再用 {% block %} 替换局部内容,不用重复写HTML骨架,页面结构统一、维护也轻松。
先建基础模板(base.html.twig)
这是所有页面共用的骨架,通常放在 templates/ 目录下:
- 包含完整的 HTML 结构:doctype、html、head、body
- 用 {% block title %}{% endblock %} 定义可变标题
- 预留 {% block stylesheets %}{% endblock %} 插入页面专属 CSS
- 设置 {% block content %}{% endblock %} 作为正文填充区
- 留出 {% block javascripts %}{% endblock %} 加载 JS 脚本
子模板继承并填内容
比如首页 templates/home.html.twig 这样写:
- 第一行必须是 {% extends 'base.html.twig' %}
- 用 {% block title %}Homepage{% endblock %} 覆盖标题
- 在 {% block content %} 里写本页独有的 HTML,比如
<h1>欢迎回来</h1> - 如果想保留父模板的 JS 并额外加一个脚本,就写:
{% block javascripts %}{{ parent() }}<script src="/js/home.js"></script>{% endblock %}
需要多级布局?中间层模板来帮忙
当后台和前台样式差异大时,可以加一层中间模板:
- 新建 templates/base-admin.html.twig
- 它先 {% extends 'base.html.twig' %},再重定义 {% block content %} 或新增 {% block sidebar %}
- 具体管理页(如 user-list.html.twig)再继承这个 admin 版,专注业务内容
还能动态选模板?用三元表达式
某些场景下,比如移动端要换布局,可以直接在子模板顶部写:
- {% extends app.request.isXmlHttpRequest ? 'base-ajax.html.twig' : 'base.html.twig' %}
- 或者根据用户角色切换:
{% extends is_granted('ROLE_ADMIN') ? 'base-admin.html.twig' : 'base-user.html.twig' %}


















