31

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

4

5 回答 5

46

何时使用继承:

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

何时使用包括:

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

另一种用法:

您注意到您的 layout.twig 有点杂乱,您想对其进行模块化,因此您将 sidebar.twig 拆分为一个单独的文件并将其包含在 layout.twig 中。

您可以将 include 用于继承用例吗:

当然,为页眉、页脚和您拥有的内容创建块,并在 50 页中的每一页中使用包含。但如上所述,这是错误的设计。

您可以将继承用于包含用例:

当然,在父 layout.twig 中为共享块创建一个空块,并创建一个扩展 layout.twig 并填充块块的二级子 layout-with-chunk.twig,以及上例中的 6 个页面然后共享块的可以扩展 layout-with-chunk.twig 而不是 layout.twig。但这又是错误的设计,因为块块并非由所有子代共享,也不应该进入基础父代。另外,您还弄乱了继承树。

所以:

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

于 2011-08-23T14:31:30.700 回答
8

我喜欢 Arms 的回答,但我认为你错过了他所说的。包含和扩展是不同的东西:如果扩展,则可以更改父级,而包含则不能。

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

{% extends "layout/default.html" %}

现在扩展给我的是使用父级的块!你没有包含的那个。现在您可以例如为每个页面专门制作一个标题:

{% block title %}My title just for this page{% endblock %}

现在,包括为您提供更严格和固定的 html,例如:

{% include 'header.html' %}

最多可能是实体重复,例如表行:

{% include 'foo' with {'foo': 'bar'} %}

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

于 2011-08-14T08:08:10.307 回答
6

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

简单的例子:

“部分/titleize.twig”:

<h2 class="title">{% block title %}Default Title{% endblock %}</h2>

“some-template.twig”将使用以下方法继承它embed

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

...

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

渲染

<h2 class="title">Section 1</h2>
...
<h2 class="title">Section 2</h2>
于 2015-02-18T22:35:16.973 回答
4

这取决于您要完成的工作。通过扩展视图,您正在使用装饰器模式。如果你熟悉 Symfony 1,这与你的 layout.php 文件输出 $sf_content 是一样的。当您有一个想要在整个项目中使用的通用 html 'shell' 时,您可以使用此方法。

另一方面,包含一个视图可以让您将一个视图注入另一个视图。

假设您有一个包含“关于”和“联系”页面的个人网站。您将有 3 个视图: base.html.twig
about.html.twig
contact.html.twig

base.html.twig包含您的网站全面使用的通用 HTML。这可能包括您的页眉、导航、页脚等(所有不/不应该跨页面更改的内容。)

about.html.twig并且contact.html.twig只包含那些特定部分的 HTML。这两种观点都有延伸base.html.twig。这消除了代码重复。如果要更改标题,只需在一个地方进行更改 - base.html.twig.

现在假设您有一些其他内容要显示在“关于”和“联系”页面上(但不一定在其他页面上) - 您可以为此创建一个单独的视图并将其包含在about.html.twigcontact.html.twig中。

文档实际上并不建议扩展包括,它们是两种不同的方法,应该用于特定目的。

希望这可以帮助!

于 2011-08-13T19:32:34.707 回答
1

Twig 扩展与 include 不同,而且功能强大得多。尝试将扩展视为与您考虑包含的方式相反的方式。通过扩展,您可以从最终视图(即 about.htm)开始并向后工作,添加在站点上制作页面所需的图层。在每个级别,通过扩展内容块覆盖或添加到该块的父内容。

“包含”没有那么灵活,您从基本模板开始,然后进入 about.htm 视图,您无法处理不同文件中的通用内容块。

查看有关三级继承的这一点,这是一种常见的扩展模式:http ://symfony.com/doc/current/book/templating.html#three-level-inheritance

于 2011-08-14T02:53:31.077 回答