Разница между Include, Extends, Use, Macro, Embed in Twig

в чем разница между use и include в Twig?

документация:

включить

на include оператор включает шаблон и возвращает отображаемое содержимое этого шаблона в текущий:

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

использовать

на use оператор сообщает Twig импортировать блоки, определенные в blocks.html в текущий шаблон (это как макросы, но для блоки):

блоки.HTML-код

{% block sidebar %}{% endblock %}

main.HTML-код

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

возможный ответ:

Я думаю этой должен объяснить разницу:

include получить весь код из внешнего файла и импортировать его в реальный файл в нужном месте вызова.

use совершенно разные, как он анализирует файл найти определенной части кода, а затем перезаписывает блоки с то же имя, в вашем текущем файле, с тем, который найден в этом внешнем файл.

include как "go найти этот файл и сделать его с моей страницы здесь".

use это "проанализируйте этот другой файл, чтобы найти определения блоков для использования мои владения определены здесь".

если use команда не находит ничего, соответствующего задаче, ничего не отображается вообще из этого файла.


вопрос

правильно ли объяснение? есть ли другие объяснения этому различию?

спасибо

1 ответов


через несколько месяцев я отправляю ответ на любую дополнительную ссылку на этот вопрос. Я также добавил некоторое описание для extends & import & macro & embed для больше зазора:

существуют различные типы наследования и повторного использования кода в веточку:

включить

главная цель повторное использование кода. Рассмотрите возможность использования header.html.twig & footer.html.twig внутри base.html.twig как образец.

.формат html.прутик!--46-->

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

базы.формат html.прутик!--46-->

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

выходит

главная цель вертикальное наследование. Подумайте о расширении base.html.twig внутри homepage.html.twig и about.html.twig как образец.

базы.формат html.прутик!--46-->

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

Домашняя страница.формат html.прутик!--46-->

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

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

о программе.формат html.прутик!--46-->

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

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

использовать

главная цель горизонтальное повторное использование. Рассмотрите возможность использования sidebar.html.twig внутри single.product.html.twig (extends product.layout.html.twig) и single.service.html.twig (extends service.layout.html.page) страниц. (это похоже на макросы, но для блоки)

боковая панель.формат html.прутик!--46-->

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

один.товар.формат html.прутик!--46-->

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

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

один.услуга.формат html.прутик!--46-->

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

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

макрос

главная цель наличие многоразовой разметки во многих шаблонах с переменными. Рассмотрим функцию, которая получает некоторые переменные и выводит некоторые разметка.

форма.формат html.прутик!--46-->

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

профиль.услуга.формат html.прутик!--46-->

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

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

добавьте

главная цель блок переопределения. Он имеет функциональность обоих Use & Include вместе. Рассмотрим вложение pagination.html.twig на product.table.html.twig & service.table.html.twig.

пагинации.формат html.прутик!--46-->

<div>
    <div>{% block first %}{% endblock %}</div>
    {% for i in (min + 1)..(max - 1) %}
        <div>{{ i }}</div>
    {% endfor %}
    <div>{% block last %}{% endblock %}</div>
</div>

продукта.таблица.формат html.прутик!--46-->

{% set min, max = 1, products.itemPerPage %}

{% embed 'pagination.html.twig' %}
    {% block first %}First Product Page{% endblock %}
    {% block last %}Last Product Page{% endblock %}
{% endembed %}

сервис.таблица.формат html.прутик!--46-->

{% 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 переменные здесь). Также вы можете передать дополнительные переменные в embedded файл:

пагинации.формат html.прутик!--46-->

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

продукта.таблица.формат html.прутик!--46-->

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