Разница между 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 %}