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