私の Symfony2 プロジェクトでは、Twig テンプレートを使用して HTML をレンダリングします。Web サイトの各ページに「アプリケーション バー」を含める必要があります。このバーの内容は、ユーザーが誰であるか、ユーザーが持っている権限などによって異なります (つまり、バックグラウンドで実行する必要があるビジネス ロジックが少しあります)。明らかな解決策は、基本テンプレートに app-bar を追加することです (各ページに表示する必要があるため)。ただし、これの問題は、ベース (親) Twig テンプレートからビジネス ロジックを実行する方法が明確でないことです。
@Flukey は、この質問で同様の問題を抱えていました。彼の解決策はrender
、小枝テンプレート内からサブコントローラーを使用することであり、それによりセカンダリコントローラーの実行が強制されます。明確にするために、彼の解決策は次のようになります。
{# ::base:html.twig #}
<!DOCTYPE html>
<html>
<head>
<title>blah</title>
{% block stylesheets %}{# default styles #}{% endblock %}
</head>
<body>
{# Question: is there a way to do add the app-bar without "render"? #}
{% render url('app_bar_route') %}
{% block body %}{% endblock %}
{% block javascripts %}{% endblock %}
</body>
</html>
そして子供:
{# AcmeDemoBundle:userpage.html.twig #}
{% extends '::base.html.twig' %}
{% block body %}user content here; Twig file rendered from "primary" PHP Controller.{% endblock %}
が機能するためにはrender
、ルートも定義する必要があります。
# routing.yml
app_bar_route:
pattern: /sitestructure/appbar
defaults: { _controller: SiteManagerBundle:AppBar:index }
しかし、この解決策は、次の理由から非常に不安です。
- まず、このソリューションは、サイトのナビゲーション バーごとに新しい URL を個別に管理する必要があることを意味します。
- 第二に、サイトのすべてのナビゲーション バーに個別の URL があり (上記
http://mysite/sitestructure/appbar
の例)、これは非常に乱雑に見えます。 - 第三に、パフォーマンスに関するこの懸念もあり、これは非常に賢明な懸念だと思います。HTML ページへの個々のユーザー リクエストが、2 つ (または 3 つまたは 4 つ) の物理的なリクエストをサーバーに送信する理由がわかりません
render
。サイトがより複雑になるにつれて追加される可能性があります)。
これを行うためのより良い方法はありますか?{% include %}
の代わりにTwig の機能を使用することは可能{% render %}
ですか? もしそうなら、ベース テンプレートのビジネス ロジックはどのように実行されますか?
編集:明確にするために、私が参照する「ビジネスロジック」のタイプはデータベース呼び出しを行う必要があります-それは私がテンプレートにコーディングしたいロジックのタイプではないので、何とかしてPHPクラス/関数に戻る必要があります.
EDIT2 :サブコントローラーの呼び出しについて本当に心配する必要がありますか? render
エンジンの仕組みを誤解していたのかもしれません。これにより、Web サーバーへの 2 番目の HTTP 要求が生成されると想定しました (明らかに、Web ブラウザーからではなく、サーバー自体からの内部要求です)。私には、これは、ある種の応答エラーを生成する可能性が高まることは言うまでもなく、かなり大きなオーバーヘッドを意味しているように思えます。しかし、フレームワークを誤解している可能性があります。その場合は、教えてください!