use
注意
水平重用是 Twig 的一项高级功能,在常规模板中几乎不需要。它主要用于需要使模板块可重用而无需使用继承的项目。
模板继承是 Twig 最强大的功能之一,但它仅限于单继承;一个模板只能扩展另一个模板。这种限制使模板继承易于理解且易于调试
1 2 3 4
{% extends "base.html.twig" %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
水平重用是一种实现与多重继承相同目标的方法,但没有相关的复杂性
1 2 3 4 5 6
{% extends "base.html.twig" %}
{% use "blocks.html.twig" %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
use
语句告诉 Twig 将 blocks.html.twig
中定义的块导入到当前模板中(它类似于宏,但用于块)
1 2
{# blocks.html.twig #}
{% block sidebar %}{% endblock %}
在此示例中,use
语句将 sidebar
块导入到主模板中。该代码在很大程度上等同于以下代码(导入的块不会自动输出)
1 2 3 4 5
{% extends "base.html.twig" %}
{% block sidebar %}{% endblock %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
注意
仅当 use
标签不扩展另一个模板、不定义宏且主体为空时,它才导入模板。但它可以使用其他模板。
注意
由于 use
语句的解析独立于传递给模板的上下文,因此模板引用不能是表达式。
主模板还可以覆盖任何导入的块。如果模板已经定义了 sidebar
块,则 blocks.html.twig
中定义的块将被忽略。为了避免名称冲突,您可以重命名导入的块
1 2 3 4 5 6 7
{% extends "base.html.twig" %}
{% use "blocks.html.twig" with sidebar as base_sidebar, title as base_title %}
{% block sidebar %}{% endblock %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
parent()
函数自动确定正确的继承树,因此可以在覆盖导入模板中定义的块时使用它
1 2 3 4 5 6 7 8 9 10
{% extends "base.html.twig" %}
{% use "blocks.html.twig" %}
{% block sidebar %}
{{ parent() }}
{% endblock %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
在此示例中,parent()
将正确地从 blocks.html.twig
模板调用 sidebar
块。
提示
重命名允许您通过调用“父”块来模拟继承
1 2 3 4 5 6 7
{% extends "base.html.twig" %}
{% use "blocks.html.twig" with sidebar as parent_sidebar %}
{% block sidebar %}
{{ block('parent_sidebar') }}
{% endblock %}
注意
您可以在任何给定的模板中使用任意数量的 use
语句。如果两个导入的模板定义了相同的块,则最后一个获胜。