Подтвердить что ты не робот

Расширение или включение - что лучше в Twig?

Почему в документации Twig рекомендуется использовать расширение, а не включать? Документация Symfony 2 говорит, что "в Symfony2 нам нравится думать об этой проблеме по-другому: шаблон может быть украшен другим". но не более того. Это просто авторская прихоть или что-то еще? Спасибо за помощь.

4b9b3361

Ответ 1

Когда использовать наследование:

У вас есть 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. Но это опять-таки неправильный дизайн, потому что блок блоков не разделяется всеми дочерними элементами и не должен входить в базовый родитель. Кроме того, вы загромождали дерево наследования.

Итак:

Как объяснялось выше - это вопрос дизайна не программируемости. Это не о том: я могу достичь этого же результата, используя другую технику программирования, о которой лучше использовать дизайн.

Ответ 2

Мне понравился ответ Arms, но я думаю, вы пропустили то, что он сказал. Включение и расширение - это разные вещи: если вы расширяете, вы можете изменить родителя, а включить include вы не можете.

например. Я расширяю базовый макет, например:

{% extends "layout/default.html" %}

Что продлить мне сейчас, это использовать блоки от родителя! У вас нет этого с включенным. Теперь вы можете, например, сделать заголовок специально для каждой страницы:

{% block title %}My title just for this page{% endblock %}

Теперь, в том числе, вы получите более жесткий и фиксированный html, например:

{% include 'header.html' %}

и, по крайней мере, может быть, рецензирование, например. строки таблицы:

{% include 'foo' with {'foo': 'bar'} %}

Итак, вы создаете свои макеты с помощью включений и расширяете свои базовые макеты, чтобы убедиться, что ваш сайт следует указанному дизайну.

Ответ 3

Чтобы добавить еще один гибридный вариант в микс, вы можете рассмотреть embed. Он позволяет использовать наследование от 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 %}

Renders

<h2 class="title">Section 1</h2>
...
<h2 class="title">Section 2</h2>

Ответ 4

Это зависит от того, что вы пытаетесь выполнить. Расширяя представление, вы используете шаблон Decorator. Если вы знакомы с Symfony 1, это то же самое, что и файл layout.php, который выводит $sf_content. Вы используете этот метод, когда у вас есть общая оболочка html, которую вы хотите использовать в проекте.

Включение представления с другой стороны позволяет вам вводить один вид в другой.

Скажем, у вас есть персональный сайт с страницами "about" и "contact". У вас будет 3 просмотра: base.html.twig
about.html.twig
contact.html.twig

base.html.twig содержит общий HTML-код, используемый вашим сайтом по всему сайту. Это может включать в себя ваш заголовок, навигацию, нижний колонтитул и т.д. (Все материалы, которые не должны/не должны меняться на разных страницах.)

about.html.twig и contact.html.twig содержат ТОЛЬКО HTML для этих конкретных разделов. Оба этих вида расширяются base.html.twig. Это устраняет дублирование кода. Если вы хотите внести изменения в заголовок, вам просто нужно внести изменения в одно место - base.html.twig.

Теперь скажем, что у вас есть еще один фрагмент контента, который вы хотите отображать на страницах "about" и "contact" (но не обязательно на других страницах) - вы можете создать для этого отдельный просмотр и включить его в about.html.twig и contact.html.twig.

Документы на самом деле не рекомендуют расширять включение, это два отдельных метода, которые должны использоваться для определенных целей.

Надеюсь, это поможет!

Ответ 5

Расширение Twig отличается и намного мощнее, чем включать. Попытайтесь думать о расширении как о том, как это происходит с противоположностью того, как вы думаете о включении. С расширением вы можете начать с представления конца (т.е. About.htm) и работать в обратном направлении, добавив слои, необходимые для создания страницы на сайте. На каждом уровне с расширением блоки контента либо перезаписывают, либо добавляют к родительскому контенту для этого блока.

"Включить" не так гибко, вы начинаете с базового шаблона и прокладываете себе путь к представлению about.htm, и вы не можете работать с общими блоками контента в разных файлах.

Проверьте этот бит на трехуровневом наследовании, который является общим шаблоном расширения: http://symfony.com/doc/current/book/templating.html#three-level-inheritance