Twig中use
和include
之间有什么区别?
包括
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
命令找不到与任务匹配的内容,则不显示任何内容 完全来自这个文件。
解释正确吗?这个差异还有其他解释吗?
感谢
答案 0 :(得分:32)
几个月后,我发布了一个答案,可以进一步提及这个问题。我还为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>
<强> base.html.twig 强>
{% include 'header.html.twig' %}
<main>{% block main %}{% endblock %}</main>
主要目标是垂直继承。考虑在base.html.twig
和homepage.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.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>
<强> 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 %}