twig模板继承是symfony组织视图层的核心机制,通过base.html.twig定义html骨架和可替换block,子模板用{% extends %}继承并覆盖指定block,支持多级继承、parent()复用父内容及动态块控制,提升一致性与维护效率。

Twig模板继承是Symfony项目组织视图层最核心、最实用的机制。它不是炫技功能,而是解决重复代码、统一页面结构、提升维护效率的日常工具。掌握它,你就能快速搭建出风格一致、逻辑清晰的前端页面。
从一个基础布局模板开始
所有继承都始于一个父模板,通常叫 base.html.twig,放在 templates/ 目录下。它不渲染具体内容,只定义骨架和可替换区域:
- 包含标准 HTML 结构:doctype、html、head、body
- 用
{% block title %}{% endblock %}定义页面标题占位区 - 用
{% block styles %}{% endblock %}预留 CSS 引入位置 - 用
{% block body %}{% endblock %}作为主内容插入点 - 可选添加导航栏、页脚等全局元素,不包在 block 里就固定显示
子模板如何继承并填充内容
新建一个页面模板,比如 home.html.twig,第一行必须写:
{% extends 'base.html.twig' %}
之后只写需要覆盖或补充的 block:
-
{% block title %}首页 - 我的应用{% endblock %}→ 替换标题 -
{% block body %}<h1>欢迎回来</h1>{% endblock %}→ 填充主体内容 - 没声明的 block(如
styles)会沿用 base 中的默认内容 - 想在子模板中复用父模板某 block 的原始内容?加
{{ parent() }}
多级继承与动态块控制
实际项目中常需更灵活的结构。比如让侧边栏根据页面类型变化:
- 在
base.html.twig中定义{% block sidebar %}{% endblock %} - 在
blog/index.html.twig里写{% block sidebar %}<ul><li>最新文章</li></ul>{% endblock %} - 在
admin/dashboard.html.twig里写{% block sidebar %}<nav>管理菜单</nav>{% endblock %} - 如果某个页面不需要侧边栏,直接留空或写
{% block sidebar %}{% endblock %}即可隐藏
配合 Symfony 表单与变量输出保持一致性
继承不只是结构复用,更是语义统一。例如在 base 中统一处理表单错误样式,在子模板中只需关注字段逻辑:
- 在 base 模板的
body区域预设{% block form_errors %}{% endblock %} - 子模板渲染表单时用
{{ form_start(form) }}和{{ form_end(form) }} - 变量输出始终用
{{ }},默认自动转义;明确要渲染 HTML 才加|raw - 常用过滤器如
|default('暂无')、|capitalize可直接在任何 block 中使用
不复杂但容易忽略:每次新建页面,先想清楚它复用哪些公共结构,再决定扩展哪个 block。模板继承的价值,就在日复一日少写几行 header 和 footer。











