Twig中的use
和include
有什么区别?
Documentation:
可能的答案:
我认为this应该解释差异:
问题
解释正确吗?对于这种差异还有其他解释吗?
最佳答案
几个月后,我将发布答案以进一步引用该问题。我还添加了一些有关extends
和import
和macro
和embed
的描述,以获取更多权限:
Twig中有多种类型的继承和代码重用:
包括
主要目标:代码重用
用例:在header.html.twig
中使用footer.html.twig
和base.html.twig
。
header.html.twig
<nav>
<div>Homepage</div>
<div>About</div>
</nav>
footer.html.twig
<footer>
<div>Copyright</div>
</footer>
base.html.twig
{% include 'header.html.twig' %}
<main>{% block main %}{% endblock %}</main>
{% include 'footer.html.twig' %}
延伸
主要目标:垂直重用
用例:在
base.html.twig
和homepage.html.twig
中扩展about.html.twig
。base.html.twig
{% include 'header.html.twig' %}
<main>{% block main %}{% endblock %}</main>
{% include 'footer.html.twig' %}
homepage.html.twig
{% extends 'base.html.twig' %}
{% block main %}
<p>Homepage</p>
{% endblock %}
about.html.twig
{% extends 'base.html.twig' %}
{% block main %}
<p>About page</p>
{% endblock %}
使用
主要目标:水平重用
用例:
sidebar.html.twig
和single.product.html.twig
中的 single.service.html.twig
。sidebar.html.twig
{% block sidebar %}<aside>This is sidebar</aside>{% endblock %}
single.product.html.twig
{% extends 'product.layout.html.twig' %}
{% use 'sidebar.html.twig' %}
{% block main %}<main>Product page</main>{% endblock %}
single.service.html.twig
{% extends 'service.layout.html.twig' %}
{% use 'sidebar.html.twig' %}
{% block main %}<main>Service page</main>{% endblock %}
注意:
巨集
主要目标:带有变量的可重用标记
用例:一个函数,该函数获取一些变量并输出一些标记。
form.html.twig
{% macro input(name, value, type) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" }}" />
{% endmacro %}
profile.service.html.twig
{% import "form.html.twig" as form %}
<form action="/login" method="post">
<div>{{ form.input('username') }}</div>
<div>{{ form.input('password') }}</div>
<div>{{ form.input('submit', 'Submit', 'submit') }}</div>
</form>
嵌入
主要目标:块覆盖
用例:将
pagination.html.twig
嵌入product.table.html.twig
和service.table.html.twig
中。pagination.html.twig
<div id="pagination">
<div>{% block first %}{% endblock %}</div>
{% for i in (min + 1)..(max - 1) %}
<div>{{ i }}</div>
{% endfor %}
<div>{% block last %}{% endblock %}</div>
</div>
product.table.html.twig
{% set min, max = 1, products.itemPerPage %}
{% embed 'pagination.html.twig' %}
{% block first %}First Product Page{% endblock %}
{% block last %}Last Product Page{% endblock %}
{% endembed %}
service.table.html.twig
{% set min, max = 1, services.itemPerPage %}
{% embed 'pagination.html.twig' %}
{% block first %}First Service Page{% endblock %}
{% block last %}Last Service Page{% endblock %}
{% endembed %}
请注意,嵌入式文件(
pagination.html.twig
)可以访问当前上下文(min
,max
变量)。另外,您还可以将其他变量传递给嵌入式文件:
pagination.html.twig
<p>{{ count }} items</p>
<div>
<div>{% block first %}{% endblock %}</div>
{% for i in (min + 1)..(max - 1) %}
<div>{{ i }}</div>
{% endfor %}
<div>{% block last %}{% endblock %}</div>
</div>
product.table.html.twig
{% set min, max = 1, products|length %}
{% embed 'pagination.html.twig' with {'count': products|length } %}
{% block first %}First Product Page{% endblock %}
{% block last %}Last Product Page{% endblock %}
{% endembed %}
注意:
它同时具有
Use
和Include
的功能。关于php - 包含,扩展,使用,宏,嵌入在Twig之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40526990/