1

私の 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 ブラウザーからではなく、サーバー自体からの内部要求です)。私には、これは、ある種の応答エラーを生成する可能性が高まることは言うまでもなく、かなり大きなオーバーヘッドを意味しているように思えます。しかし、フレームワークを誤解している可能性があります。その場合は、教えてください!

4

1 に答える 1

0

私はあなたのすべてのポイントを理解しているかどうか確信が持てません。

app_bar テンプレートを作成して、基本テンプレートに含めることができます。

<body>
    {{ include('@MyBundle/app_bar.html.twig') }}
    {% block body %}{% endblock %}
</body>

ユーザーに基づいて app_bar にさまざまなアイテムを表示できます

{% if is_granted('ROLE_ADMINx') %}
    <li><a href="{{ path('zayso_natgames_admin') }}">Admin</a></li>
{% endif %}

他にどのような「ビジネス ロジック」が必要かは明確ではありません。単純な条件を超える場合は、コードを twig 拡張に入れることができます。

もっと必要だという印象を受けますか?おそらく複数のタイプの app_bar ですか?「各ナビゲーションバー」に何か特別なものが必要だということがわかりません。

サブコントローラーの実装方法について誤解している可能性があります。サブコントローラーのリクエストは内部で行われます。ブラウザへの往復はありません。パフォーマンスへの影響は軽微です。複数の URL は必要ありません。route_app_bar は 1 つだけです。

もちろん、私が質問を完全に誤解していない限り。

于 2013-08-25T14:10:09.040 に答える