Twig 模板继承通过 {% extends %} 和 {% block %} 实现复用与定制,父模板需明确定义可覆盖区块,子模板用 {{ parent() }} 可叠加内容,变量全局透传但局部 set 仅限当前作用域。

Twig 模板继承在 Symfony 2.1.13 中是组织视图层的核心机制,关键在于用好 {% extends %} 和 {% block %},避免重复代码、提升可维护性。这个版本虽较老,但继承语法与后续版本基本一致,无需额外兼容处理。
父模板必须定义清晰的 block 区域
在 app/Resources/views/base.html.twig(或类似路径)中,要显式用 {% block name %}{% endblock %} 标出可被覆盖的区域,比如:
-
{% block title %}默认标题{% endblock %}—— 供子模板设置页面标题 -
{% block stylesheets %}{% endblock %}—— 插入页面专属 CSS -
{% block body %}{% endblock %}—— 主体内容占位符
注意:block 内容可以为空,也可以带默认值;子模板只覆盖需要修改的部分,其余自动继承父模板内容。
子模板第一行必须是 extends,且路径要准确
子模板如 app/Resources/views/default/index.html.twig 开头只能是:
{% extends '::base.html.twig' %}
其中 ::base.html.twig 表示全局模板(即 app/Resources/views/base.html.twig)。若使用 Bundle 内模板,写法为 {% extends 'AcmeDemoBundle::layout.html.twig' %}。路径错误会导致“Template not found”异常。
覆盖 block 时可复用父内容(parent() 函数)
当子模板想在父模板原有内容基础上追加或调整,而不是完全替换,就用 {{ parent() }}:
- 例如在
stylesheetsblock 中引入额外 CSS,同时保留 base 里的通用样式 {% block stylesheets %}{{ parent() }}<link rel="stylesheet" href="{{ asset('css/custom.css') }}">{% endblock %}
不调用 parent() 就是彻底覆盖;调用后相当于“叠加”,适合渐进式定制。
注意变量作用域和渲染上下文
Symfony 2.1.13 的 Twig 渲染器会把控制器传入的全部变量(包括数组、对象)透传给所有层级模板。这意味着:
- 父模板能直接访问
{{ app.user }}或{{ items }},无需额外传递 - 子模板中定义的变量(如
{% set sidebar_items = [...] %})仅在当前 block 或作用域内有效 - 避免在 block 外部写逻辑判断,否则可能被继承干扰;推荐把条件逻辑放在 block 内部或控制器中预处理


















