包含,扩展,使用,宏,嵌入树枝之间的区别

时间:2016-11-10 11:53:22

标签: php twig symfony silex

Twig中useinclude之间有什么区别?

Documentation

  

包括

     

include语句包含一个模板,并将该模板的呈现内容返回到当前模板中:

{% include 'header.html' %}
Body here...
{% include 'footer.html' %}
     

使用

     

use语句告诉Twig将blocks.html中定义的块导入当前模板(它就像宏一样,但是对于块):

     

blocks.html

{% block sidebar %}{% endblock %}
     

main.html中

{% extends "base.html" %}
{% use "blocks.html" %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}

可能的答案:

我认为this应该解释不同之处:

  

include是从外部文件获取所有代码并导入它   在调用的正确位置进入您的实际文件。

     

use完全不同,因为它解析链接文件以查找   代码的特定部分,然后用。覆盖块   同名,在当前文件中,与此外部文件中找到的名称相同   文件。

     

include就像" 去找这个文件并在我的页面上呈现"。

     

use是" 解析此其他文件以查找要使用的块定义   我在这里定义的所有权"。

     

如果use命令找不到与任务匹配的内容,则不显示任何内容   完全来自这个文件。

问题

解释正确吗?这个差异还有其他解释吗?

感谢

1 个答案:

答案 0 :(得分:32)

几个月后,我发布了一个答案,可以进一步提及这个问题。我还为extends&添加了一些说明。 import& macro& embed获得更多许可:

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

包含

主要目标是代码重用。考虑使用header.html.twig& footer.html.twigbase.html.twig为例。

<强> header.html.twig

<nav>
   <div>Homepage</div>
   <div>About</div>
</nav>

<强> base.html.twig

{% include 'header.html.twig' %}
<main>{% block main %}{% endblock %}</main>

扩展

主要目标是垂直继承。考虑在base.html.twighomepage.html.twig内扩展about.html.twig作为示例。

<强> base.html.twig

{% include 'header.html.twig' %}
<main>{% block main %}{% endblock %}</main>

<强> homepage.html.twig

{% extends 'base.html.twig' %}

{% block main %}
<p>You are at the homepage</p>
{% endblock %}

<强> about.html.twig

{% extends 'base.html.twig' %}

{% block main %}
<p>You are at the about page</p>
{% endblock %}

使用

主要目标是水平重用。考虑在sidebar.html.twig(扩展single.product.html.twig)和product.layout.html.twig(扩展single.service.html.twig)页面中使用service.layout.html.page。 (它就像宏,但是对于块)

<强> sidebar.html.twig

<aside>{% block sidebar %}{% endblock %}</aside>

<强> single.product.html.twig

{% extends 'product.layout.html.twig' %}

{% use 'sidebar.html.twig' %}
{% block main %}
<p>You are at the product page for product number 123</p>
{% endblock %}

<强> single.service.html.twig

{% extends 'service.layout.html.twig' %}

{% use 'sidebar.html.twig' %}
{% block main %}
<p>You are at the service page for service number 456</p>
{% 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 "forms.html.twig" as forms %}

<div>{{ forms.input('username') }}</div>

嵌入

主要目标是阻止覆盖。它具有Use和&amp;的功能。 Include在一起。考虑在pagination.html.twig&amp;中嵌入product.table.html.twigservice.table.html.twig

<强> pagination.html.twig

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