base.html.twig 是 Symfony 项目中所有 Twig 模板的父模板,通过 {% extends %} 被继承,用 {% block %} 定义可覆盖区域;名称非强制但需匹配 twig.default_path 配置,否则需显式指定路径,且 {% extends %} 必须位于模板首行。

直接说结论: base.html.twig 是 Symfony 项目中所有 Twig 模板的父模板,它不自己渲染,而是通过 {% extends %} 被其他模板继承,用 {% block %} 定义可被子模板覆盖的区域。
为什么必须叫 base.html.twig?
名字本身不是硬性要求,但 Symfony 的默认配置(twig.default_path)和社区约定让它放在 templates/ 下并命名为 base.html.twig。如果你改名或挪位置,就得在 config/packages/twig.yaml 里显式配置 default_path 或在子模板里写完整路径,比如:{% extends 'layouts/main.html.twig' %} —— 否则 Twig 找不到父模板会报错:Unable to find template "base.html.twig"。
怎么定义可替换的 block?
在 base.html.twig 中,用 {% block %} 标出内容“插槽”,子模板按需重写。常见做法包括:
-
{% block title %}My App{% endblock %}:供子模板设置页面标题,常配合<title>{% block title %}{% endblock %}</title> -
{% block stylesheets %}{% endblock %}:插入 CSS,避免子模板直接写<link>导致重复或顺序错乱 -
{% block body %}{% endblock %}:主内容区,子模板必须在这里放实际 HTML - 用
{{ parent() }}可保留父模板原有内容,比如在子模板里追加 JS:{% block javascripts %}{{ parent() }}<script src="extra.js"></script>{% endblock %}
子模板怎么正确继承并填充?
子模板第一行必须是 {% extends 'base.html.twig' %}(路径基于 templates/),之后才能定义 {% block %}。注意:
立即学习“前端免费学习笔记(深入)”;
- 不能在
{% extends %}前写任何输出(包括空格、换行),否则 Twig 报错:SyntaxError: A template that extends another one cannot have a body - 子模板里没声明的
block会显示父模板里的默认内容;声明了但留空({% block sidebar %}{% endblock %})就什么也不输出 - 如果子模板需要动态传参(如
user),得靠控制器渲染时传入,base.html.twig本身不接收参数,它只是骨架
容易忽略的加载顺序和性能点
Twig 继承是编译期行为,不是运行时拼接 —— 所以 base.html.twig 的 {% block %} 内容不会被多次解析,性能影响极小。但要注意:
- CSS/JS 加载位置影响渲染阻塞:把
{% block javascripts %}放在


















