2

次のような基本テンプレートがあるとします。

// Default/index.html.twig
{% block javascripts %}
    <script>//some script</script>
{% endblock %}

<div>
    {{ render(controller(MyControllerBundle:Default:header)) }}
</div>
{{ text }}
<div>
    {{ render(controller(MyControllerBundle:Default:footer)) }}
</div>

そして、これはこれらのテンプレートを持つコントローラをレンダリングします:

// Default/header.html.twig
Header content
{% block javascripts %}
   <script>//some additional scripts from the header</script>
{% endblock %}

// Default/footer.html.twig
Footer content
{% block javascripts %}
   <script>//some additional scripts from the footer</script>
{% endblock %}  

親テンプレートでレンダリングされたサブコントローラーからjavascriptsブロックを使用することは何とか可能ですか? すべての JavaScript を 1 か所にまとめたいと考えています。

テンプレートは、異なるコントローラーによってレンダリングされる複数のブロックで構成されているため、ここでは拡張を伴うボトムアップ レンダリングはオプションではありません。

これはどういうわけか可能ですか?または、これに対するより良いアプローチはありますか?

4

3 に答える 3

2

何でも可能ですが、デザイン的には良い考えではないかもしれません。

このrenderタグは、スケーリングに関して非常に役立ち、リクエストを分離する方法として使用されます。各render呼び出しはサブリクエストと見なされ、キャッシュ戦略を適用できます。HTTP キャッシングに関するこのドキュメント、特に Edge Side includes (または ESI)について説明している部分を読むことを強くお勧めします。

タグを使用するときrenderは、複数のページに含めて最終的にキャッシュするモジュールと考えてください。

サブ リクエストはキャッシングのために分離されているため、マスター リクエストを操作しないでください (render タグを埋め込む場所によっては、マスター リクエストが異なるため、予期しない結果が生じる可能性があります)。

まず、他のすべてのページが拡張するレイアウト テンプレートを作成します。レイアウト テンプレートは、すべての基本ブロック (javascript、css、フッター、ヘッダーなど) を宣言します。必要に応じて、より多くのテンプレートで抽象<head><body>できます。

フッターまたはヘッダーのロジックがある場合は、それらを Twig 関数 (またはフィルター) に分割し、Twig でロジックを処理しますが、軽量に保ちます (複雑すぎるかスパゲッティすぎる場合は、別の方法があることを意味します)。

1 ページに複数の Javascript または CSS ファイルを含めることは避けてください。すべてではなく一部のページに表示される css や javascript がある場合でも、それらを 1 つのファイルにマージすることをお勧めします (クライアント側での DNS 呼び出しが少なくなり、キャッシュされると、ページの読み込みが速くなります)。 . 種類のファイルがある場合administrator.jsは、それを別のファイルとして含めることができますが、ほとんどの要求が管理者からのものである場合は、他のすべてのファイルと一緒に含めることをお勧めします。

アセット (js または css) を 1 つのファイルに結合できることを知らなかった場合: 詳細はSymfony のドキュメントを参照してください。

そのようなシステムを実装しないことを強くお勧めするため、「方法」の質問には答えませんでしたが、情報に基づいた決定を下すための優れたガイドラインを共有したと思います.

于 2013-07-19T16:51:59.910 に答える
0

コメントで@Paziが言っていることとまったく同じです:コントローラーが必要ですか?コントローラーを使用せずに、テンプレートを単独でインクルードするのは非常に簡単に見えます。

includeタグを使用して、サブテンプレートを含めることができます。

{% include 'MyControllerBundle:Default:header.html.twig' %}

レンダリングされたサブ コントローラーから JavaScript ブロックを再利用するために、javascripts ブロックを含む基本テンプレートを作成できます。次に、ヘッダーとフッターでそのベース テンプレート ファイルを拡張します。または、基本テンプレートを含めるだけでも機能するはずです。

于 2013-07-19T15:02:15.250 に答える