Расширение или включение - что лучше в Twig? - PullRequest
30 голосов
/ 13 августа 2011

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

Ответы [ 5 ]

46 голосов
/ 23 августа 2011

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

У вас есть 50 страниц с одинаковым макетом - вы создаете layout.twig в качестве родителя, и каждая страница расширяет этот layout.twig. Таким образом, родитель является родовым, а ребенок - конкретным.

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

Из 50 страниц есть 6 страниц, которые разделяют кусок HTML - вы создаете shared-chunk.twig и включаете его в эти 6 страниц.

Другое использование:

Вы заметили, что ваш layout.twig немного загроможден, и вы хотели бы его модульнить, поэтому вы разбили sidebar.twig на отдельный файл и включили его в layout.twig.

Можете ли вы использовать include для случая использования наследования:

Конечно, создавайте фрагменты для верхнего и нижнего колонтитула и того, что у вас есть, и используйте их на каждой из 50 страниц. Но это неправильный дизайн, как объяснено выше.

Можно ли использовать наследование для прецедента включения:

Конечно, создайте пустой блок для общего блока в родительском layout.twig и создайте дочерний layout-with-chunk.twig второго уровня, который расширяет layout.twig и заполняет блок chunk, а 6 страниц Приведенный выше пример, который совместно использует чанк, может затем расширить layout-with-chunk.twig вместо layout.twig. Но это опять-таки неправильный дизайн, поскольку блок чанка не используется всеми дочерними элементами и не должен входить в базовый родительский элемент Кроме того, вы загромождали дерево наследства.

Итак:

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

8 голосов
/ 14 августа 2011

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

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

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

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

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

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

{% include 'header.html' %}

и, самое большее, может дать право повторения,например, строки таблицы:

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

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

6 голосов
/ 19 февраля 2015

Просто, чтобы добавить еще один гибридный вариант в микс, вы можете рассмотреть 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 %}

Отображает

<h2 class="title">Section 1</h2>
...
<h2 class="title">Section 2</h2>
4 голосов
/ 13 августа 2011

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

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

Допустим, у вас есть персональный сайт со страницами «о» и «контакт». Вы бы имели 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.html.twig и contact.html.twig.

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

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

1 голос
/ 14 августа 2011

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

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

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

...