use

注解

水平重用是一种高级的Twig特性,在常规模板中几乎不需要。它主要用于那些需要在不使用继承的情况下使模板块可重用的项目。

模板继承是Twig最强大的特性之一,但它仅限于单个继承;一个模板只能扩展另一个模板。此限制使模板继承易于理解和调试:

1
2
3
4
{% extends "base.html" %}

{% block title %}{% endblock %}
{% block content %}{% endblock %}

水平重用是实现与多重继承相同目标的一种方法,但没有相关的复杂性:

1
2
3
4
5
6
{% extends "base.html" %}

{% use "blocks.html" %}

{% block title %}{% endblock %}
{% block content %}{% endblock %}

这个 use 语句告诉Twig导入中定义的块 blocks.html 到当前模板中(类似于宏,但对于块):

1
2
3
{# blocks.html #}

{% block sidebar %}{% endblock %}

在这个例子中, use 语句导入 sidebar 块到主模板中。代码主要相当于以下代码(导入的块不会自动输出):

1
2
3
4
5
{% extends "base.html" %}

{% block sidebar %}{% endblock %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}

注解

这个 use 标记只在不扩展其他模板、不定义宏以及正文为空时导入模板。但它可以 use 其他模板。

注解

因为 use 语句的解析独立于传递给模板的上下文,模板引用不能是表达式。

导入的块也可以覆盖任何主模板。如果模板已经定义 sidebar 块,然后是中定义的 blocks.html 被忽略。为了避免名称冲突,可以重命名导入的块:

1
2
3
4
5
6
7
{% extends "base.html" %}

{% use "blocks.html" 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" %}

{% use "blocks.html" %}

{% block sidebar %}
    {{ parent() }}
{% endblock %}

{% block title %}{% endblock %}
{% block content %}{% endblock %}

在这个例子中, parent() 将正确调用 sidebar 阻止 blocks.html 模板。

小技巧

重命名允许您通过调用“parent”块来模拟继承:

1
2
3
4
5
6
7
{% extends "base.html" %}

{% use "blocks.html" with sidebar as parent_sidebar %}

{% block sidebar %}
    {{ block('parent_sidebar') }}
{% endblock %}

注解

你可以用很多 use 任何给定模板中的语句。如果两个导入的模板定义了同一个块,则最新的一个将获胜。