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.但这又是错误的设计,因为块块不是所有子节点共享的,不应该进入基本父节点.另外,你把继承树弄得乱七八糟.
所以:
如上所述 - 这是设计问题,而不是可编程性.它不是关于:我可以使用不同的编程技术来实现相同的结果,它的用法是更好的设计.
我喜欢武器回答,但我想你错过了他说的话.包含和扩展是不同的东西:如果你扩展,你可以改变父,用你不能的包含.
例如,我扩展了我的基本布局,如下所示:
{% 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构建布局,并扩展基本布局以确保您的站点遵循指定的设计.
只是为了添加另一个混合选项,您可以考虑嵌入.它允许您利用继承,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)
| 归档时间: |
|
| 查看次数: |
17737 次 |
| 最近记录: |