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

Pmp*_*mpr 16 php symfony twig silex

useincludeTwig有什么区别?

文件:

包括

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

?{% include 'header.html' %}
Body here...
{% include 'footer.html' %}
Run Code Online (Sandbox Code Playgroud)

使用

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

blocks.html

{% block sidebar %}{% endblock %}
Run Code Online (Sandbox Code Playgroud)

main.html中

{% extends "base.html" %}
{% use "blocks.html" %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
Run Code Online (Sandbox Code Playgroud)

可能的答案:

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

include 是从外部文件获取所有代码并将其导入到调用的正确位置的实际文件中.

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

include就像" 去找这个文件并用我的页面在这里渲染 ".

use是" 解析此其他文件以查找要使用的块定义,而不是我在此处定义的所有权 ".

如果use命令找不到与任务匹配的内容,则此文件中根本不显示任何内容.


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

谢谢

Pmp*_*mpr 41

几个月后,我发布了一个答案,可以进一步参考这个问题.我还添加了一些描述为extends&import&macro&embed更多间隙:

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

包括

主要目标是代码重用.考虑使用header.html.twig&footer.html.twiginside base.html.twig作为示例.

header.html.twig

<nav>
   <div>Homepage</div>
   <div>About</div>
</nav>
Run Code Online (Sandbox Code Playgroud)

base.html.twig

{% include 'header.html.twig' %}
<main>{% block main %}{% endblock %}</main>
Run Code Online (Sandbox Code Playgroud)

扩展

主要目标是垂直继承.考虑扩展base.html.twig内部homepage.html.twigabout.html.twig作为示例.

base.html.twig

{% include 'header.html.twig' %}
<main>{% block main %}{% endblock %}</main>
Run Code Online (Sandbox Code Playgroud)

homepage.html.twig

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

{% block main %}
<p>You are at the homepage</p>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

about.html.twig

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

{% block main %}
<p>You are at the about page</p>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

使用

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

sidebar.html.twig

<aside>{% block sidebar %}{% endblock %}</aside>
Run Code Online (Sandbox Code Playgroud)

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 %}
Run Code Online (Sandbox Code Playgroud)

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 %}
Run Code Online (Sandbox Code Playgroud)

主要目标是在具有变量的许多模板上具有可重用的标记.考虑一个获取一些变量并输出一些标记的函数.

form.html.twig

{% macro input(name, value, type) %}
    <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" }}" />
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

profile.service.html.twig

{% import "forms.html.twig" as forms %}

<div>{{ forms.input('username') }}</div>
Run Code Online (Sandbox Code Playgroud)

主要目标是阻止覆盖.它有两个功能Use:Include在一起.考虑嵌入pagination.html.twigproduct.table.html.twig&service.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>
Run Code Online (Sandbox Code Playgroud)

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 %}
Run Code Online (Sandbox Code Playgroud)

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 %}
Run Code Online (Sandbox Code Playgroud)

请注意,嵌入的文件(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>
Run Code Online (Sandbox Code Playgroud)

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 %}
Run Code Online (Sandbox Code Playgroud)