Intereting Posts
Сортировка массива по ключам другого массива Как я вставляю только определенные части PHP-страницы, используя PHP PHP в TOMCAT 6 – Исключение Как получить информацию о отправленном запросе PHP curl PHP-версия класса атрибутов свойств ASP.NET/C# как я сортирую следующий объект array / stdclass в php? Получение значений из флажка Поиск внутри сериализованных данных с помощью MYSQL Как получить идентификатор сообщения в WordPress Admin Предупреждение «Не обращайтесь к суперглобальному $ _POST массиву напрямую» на Netbeans 7.4 для PHP Facebook PHP сообщение на страницу поклонников cronjob? PHP: определение визуально искаженных изображений (правда, актуальных), загруженных через Curl с помощью GD / Imagemagick как я могу установить данные из базы данных в поле с помощью формы в zend framework 1.11 Как использовать python для аутентификации с помощью Google в grpc? (У меня есть исполняемый PHP-код) Бесконечная прокрутка пейджинга

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

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

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

включают

Оператор 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 %} 

Вариант ответа:

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

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