web-dev-qa-db-ja.com

拡張または含める-Twigの何が優れていますか?

なぜTwigドキュメントは含めるのではなく拡張を使用することを推奨していますか?Symfony2のドキュメントでは、この問題について別の考え方をしたいのです。テンプレートは別のテンプレートで装飾できます。」と書かれていますが、何もありません。 more。それは単なる作者の気まぐれか何かですか?助けてくれてありがとう.

31
Isinlor

継承を使用する場合:

同じレイアウトを共有する50ページがあります。親としてlayout.twigを作成し、各ページがそのlayout.twigを拡張します。したがって、親はジェネリックであり、子は特定です。

いつ使用するか:

50ページのうち、HTMLのチャンクを共有する6ページがあります。shared-chunk.twigを作成し、それらの6ページに含めます。

別の使用法:

Layout.twigが少し雑然としていて、モジュール化したいので、sidebar.twigを別のファイルに分割し、layout.twigに含めます。

継承のユースケースにincludeを使用できます:

確かに、ヘッダー、フッターなどのチャンクを作成し、50ページごとにインクルードを使用します。しかし、上で説明したように、それは間違った設計です。

includeユースケースの継承を使用できますか:

確かに、親のlayout.twigに共有チャンクの空のブロックを作成し、layout.twigを拡張してチャンクブロックに入力する2番目のレベルの子layout-with-chunk.twigを作成し、上記の例の6ページを作成します。チャンクを共有するものは、layout.twigの代わりにlayout-with-chunk.twigを拡張できます。しかし、チャンクブロックはすべての子で共有されているわけではなく、ベースの親に入るべきではないため、これも間違った設計です。さらに、継承ツリーが乱雑になっています。

そう:

上で説明したように、それはプログラム可能性ではなく設計の問題です。それは重要ではありません。私は別のプログラミング手法を使用してこれと同じ結果を得ることができ、どの使用法がより良い設計であるかについてです。

46
Basel Shishani

私はアームズの答えが好きでしたが、あなたは彼の言ったことを見逃したと思います。インクルードと拡張は別のものです。拡張する場合、親を変更できますが、インクルードは変更できません。

例えば。次のように、基本レイアウトを拡張します。

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

拡張によって今私に与えられるのは、親からのブロックを使用することです!インクルードではそれはありません。これで、たとえばすべてのページに固有のタイトルを作成します。

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

これで、を含めると、より厳密で固定されたhtmlが得られます。例:

{% include 'header.html' %}

そして、せいぜい多分、エンティティの繰り返し、例えばテーブルの行:

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

したがって、インクルードを使用してレイアウトを構築し、基本レイアウトを拡張して、サイトが指定されたデザインに従っていることを確認します。

8
Tjorriemorrie

別のハイブリッドオプションをミックスに追加するだけで、 embed も検討できます。 extendsからの継承を活用できますが、includeのように複数回再利用することもできます。

簡単な例:

"partials/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>
6
yuvilio

それはあなたが達成しようとしていることに依存します。ビューを拡張することで、デコレータパターンを使用しています。 Symfony 1に精通している場合、これは$ sf_contentを出力するlayout.phpファイルを使用するのと同じです。このメソッドは、プロジェクト全体で使用する共通の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を拡張します。これにより、コードの重複がなくなります。ヘッダーに変更を加える場合は、1か所(base.html.twig)で変更を加えるだけです。

ここで、「概要」ページと「連絡先」ページに表示したい他のコンテンツがあるとします(ただし、必ずしも他のページに表示する必要はありません)。これ用に別のビューを作成して、about.html.twigに含めることができます。およびcontact.html.twig

ドキュメントでは、実際にインクルードを拡張することを推奨していません。これらは、特定の目的で使用する必要がある2つの個別の方法です。

お役に立てれば!

4

小枝の拡張は、含めるよりも異なり、はるかに強力です。インクルードについて考えているのとは逆の方法で拡張を考えてみてください。拡張機能を使用すると、エンドビュー(つまりabout.htm)から始めて逆方向に作業し、サイトにページを作成するために必要なレイヤーを追加できます。各レベルで、拡張機能を使用すると、コンテンツのブロックがそのブロックの親コンテンツを上書きまたは追加します。

「インクルード」はそれほど柔軟ではありません。基本テンプレートから始めて、about.htmビューに移動します。また、さまざまなファイルにまたがる共通のコンテンツブロックを操作することはできません。

一般的な拡張パターンである3レベルの継承について、このビットを確認してください。 http://symfony.com/doc/current/book/templating.html#three-level-inheritance

1
Acyra