扩展或包括 - 在Twig中哪个更好?

Isi*_*lor 31 php template-engine symfony twig

为什么Twig文档建议使用扩展而不是包含?Symfony 2文档说因为"在Symfony2中,我们喜欢以不同的方式思考这个问题:模板可以用另一个模板来装饰." 但仅此而已.这只是作者的心血来潮还是其他什么?感谢帮助.

Bas*_*ani 46

何时使用继承:

你有50个页面共享相同的布局 - 你创建一个layout.twig作为父,每个页面扩展该layout.twig.所以父母是通用的,孩子是特定的.

何时使用包括:

在50个页面中,有6个页面共享一大块HTML - 您创建了一个shared-chunk.twig并将其包含在这6个页面中.

另一种用法:

您注意到layout.twig有点混乱并且您希望将其模块化,因此您将sidebar.twig拆分为单独的文件并将其包含在layout.twig中.

你可以使用include作为继承用例:

当然,为页眉,页脚和你有什么创建块,并在50页的每一页中使用包含.但如上所述,这是错误的设计.

你可以使用包含用例的继承:

当然,在父layout.twig中为共享块创建一个空块,并创建第二级子layout-with-chunk.twig,它扩展layout.twig并填充块块,以及上面示例中的6个页面然后,共享块可以扩展layout-with-chunk.twig而不是layout.twig.但这又是错误的设计,因为块块不是所有子节点共享的,不应该进入基本父节点.另外,你把继承树弄得乱七八糟.

所以:

如上所述 - 这是设计问题,而不是可编程性.它不是关于:我可以使用不同的编程技术来实现相同的结果,它的用法是更好的设计.


Tjo*_*rie 8

我喜欢武器回答,但我想你错过了他说的话.包含和扩展是不同的东西:如果你扩展,你可以改变父,用你不能的包含.

例如,我扩展了我的基本布局,如下所示:

{% extends "layout/default.html" %}
Run Code Online (Sandbox Code Playgroud)

现在扩展给我的是使用来自父母的块!你没有包括.现在你可以为每个页面专门制作一个标题:

{% block title %}My title just for this page{% endblock %}
Run Code Online (Sandbox Code Playgroud)

现在,包括给你更严格和固定的HTML,例如:

{% include 'header.html' %}
Run Code Online (Sandbox Code Playgroud)

并且最多可能是repitition,例如表格行:

{% include 'foo' with {'foo': 'bar'} %}
Run Code Online (Sandbox Code Playgroud)

因此,您使用includes构建布局,并扩展基本布局以确保您的站点遵循指定的设计.


yuv*_*lio 6

只是为了添加另一个混合选项,您可以考虑嵌入.它允许您利用继承,extends但也允许多次重用include.

琐碎的例子:

"谐音/ titleize.twig":

<h2 class="title">{% block title %}Default Title{% endblock %}</h2>
Run Code Online (Sandbox Code Playgroud)

"some-template.twig"将使用embed以下内容继承:

{% embed "partials/titleize.twig" %}
    {% block title %}Section 1{% endblock %}
{% endembed %}

...

{% embed "partials/titleize.twig" %}
    {% block title %}Section 2{% endblock %}
{% endembed %}
Run Code Online (Sandbox Code Playgroud)

呈现

<h2 class="title">Section 1</h2>
...
<h2 class="title">Section 2</h2>
Run Code Online (Sandbox Code Playgroud)