Twig中的useinclude有什么区别?

Documentation:



可能的答案:

我认为this应该解释差异:



问题

解释正确吗?对于这种差异还有其他解释吗?

最佳答案

几个月后,我将发布答案以进一步引用该问题。我还添加了一些有关extendsimportmacroembed的描述,以获取更多权限:

Twig中有多种类型的继承和代码重用:

包括

主要目标:代码重用

用例:header.html.twig中使用footer.html.twigbase.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.twighomepage.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.twigsingle.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 %}

注意:
  • 就像宏,但用于块。
  • use标签仅在不扩展另一个模板,未定义宏且主体为空的情况下才导入模板。


  • 巨集

    主要目标:带有变量的可重用标记

    用例:一个函数,该函数获取一些变量并输出一些标记。

    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.twigservice.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)可以访问当前上下文(minmax变量)。

    另外,您还可以将其他变量传递给嵌入式文件:

    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 %}
    

    注意:

    它同时具有UseInclude的功能。

    关于php - 包含,扩展,使用,宏,嵌入在Twig之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40526990/

    10-14 15:07