Twig のドキュメントでは、インクルードではなく拡張の使用が推奨されているのはなぜですか? Symfony 2 のドキュメントには、「Symfony2 では、この問題を別の方法で考えたいと思っています。つまり、テンプレートは別のテンプレートによって装飾される可能性があるからです」と書かれています。しかし、それ以上はありません。作者の気まぐれか、それ以上か。手伝ってくれてありがとう。
5 に答える
継承を使用する場合:
同じレイアウトを共有する 50 ページがあります。親として layout.twig を作成し、各ページがその layout.twig を拡張します。したがって、親はジェネリックで、子はスペシフィックです。
使用する場合は次のとおりです。
50 ページのうち、HTML のチャンクを共有する 6 ページがあります。shared-chunk.twig を作成し、それらの 6 ページに含めます。
別の使用法:
あなたは、layout.twig が少し雑然としていることに気付き、それをモジュール化したいので、sidebar.twig を別のファイルに分割して、layout.twig に含めます。
継承のユースケースにインクルードを使用できますか:
もちろん、ヘッダー、フッターなどのチャンクを作成し、50 ページのそれぞれにインクルードを使用してください。しかし、上で説明したように、それは間違った設計です。
インクルードのユースケースに継承を使用できますか:
確かに、親layout.twigで共有チャンク用の空のブロックを作成し、layout.twigを拡張してchunkブロックを埋める第2レベルの子layout-with-chunk.twigを作成し、上記の例の6ページチャンクを共有するものは、layout.twig の代わりに layout-with-chunk.twig を拡張できます。しかし、これも間違った設計です。チャンク ブロックはすべての子によって共有されているわけではなく、ベースの親に入るべきではありません。さらに、継承ツリーが散らかっています。
そう:
上で説明したように、これはプログラマビリティではなく設計の問題です。それは、別のプログラミング手法を使用してこれと同じ結果を達成できるということではありません。どの使用法がより良い設計であるかについてです。
Arms の回答は気に入りましたが、彼の言ったことを聞き逃したと思います。インクルードと拡張は別のものです。拡張すると親を変更できますが、インクルードでは変更できません。
たとえば、次のようにベース レイアウトを拡張します。
{% extends "layout/default.html" %}
今私に与えられた拡張は、親からのブロックを使用することです! インクルードではそれがありません。たとえば、すべてのページに固有のタイトルを作成できます。
{% block title %}My title just for this page{% endblock %}
現在、インクルードにより、より厳格で固定された html が提供されます。たとえば、次のようになります。
{% include 'header.html' %}
そしてせいぜいエンティティの繰り返し、たとえばテーブルの行:
{% include 'foo' with {'foo': 'bar'} %}
したがって、インクルードを使用してレイアウトを構築し、基本レイアウトを拡張して、サイトが指定されたデザインに従うようにします。
別のハイブリッドなオプションをミックスに追加するだけで、組み込みも検討できます。からの継承を活用できますが、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>
それはあなたが達成しようとしていることに依存します。ビューを拡張することで、Decorator パターンを使用しています。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」ページと「contact」ページに表示したいコンテンツが他にあるとしましょう (必ずしも他のページにあるとは限りません) - これに対して別のビューを作成し、 と に含めることができabout.html.twig
ますcontact.html.twig
。
ドキュメントでは、インクルードを拡張することは実際には推奨されていません。これらは、特定の目的に使用する必要がある 2 つの別個の方法です。
お役に立てれば!
Twigエクステンションは、インクルードとは異なり、はるかに強力です。インクルードについて考えているのとは逆の方向から拡張を考えてみてください。拡張機能を使用すると、エンドビュー(つまりabout.htm)から始めて逆方向に作業し、サイトにページを作成するために必要なレイヤーを追加できます。各レベルで、拡張機能を使用して、コンテンツのブロックを上書きするか、そのブロックの親コンテンツに追加します。
「インクルード」はそれほど柔軟ではありません。基本テンプレートから始めて、about.htmビューに進んでいきます。また、さまざまなファイルにまたがる共通のコンテンツブロックを操作することはできません。
一般的な拡張パターンである3レベルの継承に関するこのビットを確認してください:http ://symfony.com/doc/current/book/templating.html#three-level-inheritance