Почему в документации Twig рекомендуется использовать расширение, а не включение? Документация Symfony 2 говорит, что «в Symfony2 нам нравится думать об этой проблеме по-другому: шаблон может быть украшен другим». но не более того. Это просто прихоть автора или что-то еще? Спасибо за помощь.
Когда использовать наследование:
У вас есть 50 страниц, разделяющих один и тот же макет – вы создаете layout.twig как родительский, и каждая страница расширяет этот layout.twig. Таким образом, родитель является общим, а дочерний – конкретным.
Когда следует использовать:
Из 50 страниц есть 6 страниц, которые разделяют кусок HTML – вы создаете shared-chunk.twig и включаете его на этих 6 страницах.
Другое использование:
Вы заметили, что ваш layout.twig немного загроможден, и вы хотите его модулизировать, поэтому вы разделите sidebar.twig в отдельный файл и включите его в layout.twig.
Можете ли вы использовать include для прецедента наследования:
Конечно, создайте куски для заголовка, нижнего колонтитула и того, что у вас есть, и используйте его на каждой из 50 страниц. Но это неправильный дизайн, как объяснялось выше.
Можете ли вы использовать наследование для варианта использования include:
Конечно, создайте пустой блок для общего фрагмента в родительском layout.twig и создайте дочерний макет уровня второго уровня с помощью chunk.twig, который расширяет layout.twig и заполняет блок блоков, а 6 страниц в приведенном выше примере которые разделяют кусок, могут затем расширить layout-with-chunk.twig вместо layout.twig. Но это опять-таки неправильный дизайн, потому что блок блоков не разделяется всеми дочерними элементами и не должен входить в базовый родитель. Кроме того, вы загромождали дерево наследования.
Так:
Как объяснялось выше – это вопрос не программируемости дизайна. Это не о том: я могу достичь такого же результата, используя другую технику программирования, о которой лучше использовать дизайн.
Мне понравился ответ Арм, но я думаю, вы пропустили то, что он сказал. Включение и продление – это разные вещи: если вы расширяетесь, вы можете изменить родителя, а включить это невозможно.
Например, я расширяю базовый макет, например:
{% extends "layout/default.html" %} 
Что расширение дает мне сейчас, это использовать блоки от родителя! У вас нет этого с включенным. Теперь вы можете, например, сделать заголовок специально для каждой страницы:
 {% block title %}My title just for this page{% endblock %} 
Теперь, в том числе дает вам более жесткий и фиксированный html, например:
 {% include 'header.html' %} 
и, по крайней мере, может быть, референция, например, строки таблицы:
 {% include 'foo' with {'foo': 'bar'} %} 
Таким образом, вы создаете свои макеты с помощью включений, и расширяете свои базовые макеты, чтобы убедиться, что ваш сайт соответствует назначенному дизайну.
  Просто добавьте еще один гибридный вариант в микс, вы можете подумать о встраивании .  Это позволяет вам использовать наследование от extends но также допускает множественное повторное использование типа include . 
Тривиальный пример:
"Обертоны / titleize.twig":
 <h2 class="title">{% block title %}Default Title{% endblock %}</h2> 
  «some-template.twig» наследует его, используя embed : 
 {% embed "partials/titleize.twig" %} {% block title %}Section 1{% endblock %} {% endembed %} ... {% embed "partials/titleize.twig" %} {% block title %}Section 2{% endblock %} {% endembed %} 
Оказывает
 <h2 class="title">Section 1</h2> ... <h2 class="title">Section 2</h2> 
Это зависит от того, что вы пытаетесь выполнить. Расширяя представление, вы используете шаблон Decorator. Если вы знакомы с Symfony 1, это то же самое, что и файл layout.php, который выводит $ sf_content. Вы используете этот метод, когда у вас есть общая оболочка html, которую вы хотите использовать в проекте.
С другой стороны, с другой стороны, вы можете вводить один вид в другой.
  Допустим, у вас есть персональный сайт с страницами «about» и «contact».  У вас было бы 3 просмотра: base.html.twig 
 about.html.twig 
 contact.html.twig 
  base.html.twig содержит общий HTML- base.html.twig , используемый вашим сайтом по всему сайту.  Это может включать ваш заголовок, навигацию, нижний колонтитул и т. Д. (Все материалы, которые не должны / не должны меняться на разных страницах). 
  about.html.twig и contact.html.twig содержат ТОЛЬКО HTML для этих конкретных разделов.  Оба этих вида расширяют base.html.twig .  Это устраняет дублирование кода.  Если вы хотите внести изменения в заголовок, вам просто нужно внести изменения в одно место – base.html.twig . 
  Теперь предположим, что у вас есть еще один фрагмент контента, который вы хотите отображать на страницах «about» и «contact» (но не обязательно на других страницах) – вы можете создать для этого отдельный просмотр и включить его в about.html.twig и contact.html.twig . 
Документы на самом деле не рекомендуют расширять включение, это два отдельных метода, которые должны использоваться для определенных целей.
Надеюсь это поможет!
Расширение Twig отличается и намного мощнее, чем включать. Попытайтесь думать о расширении как о том, как это происходит с противоположностью того, как вы думаете о включении. С расширением вы можете начать с представления конца (т. Е. About.htm) и работать назад, добавляя слои, которые вам нужны, чтобы сделать страницу на сайте. На каждом уровне с расширением блоки контента либо перезаписывают, либо добавляют к родительскому контенту для этого блока.
«Включить» не так гибко, вы начинаете с базового шаблона и прокладываете себе путь к представлению about.htm, и вы не можете работать с общими блоками контента в разных файлах.
Проверьте этот бит на трехуровневом наследовании, который является общим шаблоном расширения: http://symfony.com/doc/current/book/templating.html#three-level-inheritance