В чем разница между use
и include
в Twig?
включают
Оператор
include
включает шаблон и возвращает отображаемый контент этого шаблона в текущий:
- Как визуализировать объект DateTime в шаблоне Twig
- Элемент настройки массива от Twig
- Как правильно включить расширение песочницы twig в Symfony2?
- Как я могу условно переопределить блок макета TWIG?
- CakePHP TwigView Plugin отсутствует ошибка просмотра
{% 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 %}
Я думаю, что это должно объяснить разницу:
include
– получить весь код из внешнего файла и импортировать его в ваш фактический файл в нужном месте вызова.
use
полностью отличается от того, как он анализирует связанный файл, чтобы найти конкретный раздел кода, а затем перезаписывает блоки с тем же именем в вашем текущем файле с помощью найденного в этом внешнем файле.
include
– это как « пойти найти этот файл и отобразить его с моей страницей здесь ».
use
– « проанализировать этот другой файл, чтобы найти определения блоков, которые будут использоваться вместо моих прав, определенных здесь ».Если команда
use
не находит ничего, что соответствует задаче, из этого файла ничего не отображается.
Правильное объяснение? есть ли другие объяснения этой разницы?
благодаря
После нескольких месяцев я отправляю ответ для дальнейшей ссылки на этот вопрос. Я также добавил некоторое описание для extends
& import
& macro
& embed
для большего разрешения:
Существуют различные типы наследования и повторного использования кода в Twig:
Основная цель – повторное использование кода . Рассмотрим header.html.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
расширения base.html.twig
в 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.product.html.twig
в 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>
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
& Include
вместе. Рассмотрим вложение pagination.html.twig
в 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
variables здесь). Также вы можете передать дополнительные переменные во встроенный файл:
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 %}