1

私は Symfony2 を初めて使用し、特にキャッシングに関して、すべてのページ要求で使用されるナビゲーション バー HTML を生成する最良の方法を考えていました。

したがって、すべてのページ リクエストが、ログインしているユーザーと、未読メッセージの数を示す数字を表示する場合を想像してみてください (実際には、そのための stackoverflow のように)。情報が最新であることを確認するために、すべてのコントローラーで生成できると思います(もちろん、関数または何かを使用して)-しかし、コントローラーの出力全体をキャッシュすることも検討しており、それが良いと思いますこの動的部分を分離しておくために。

この種のものすべてに対してコントローラー拡張機能を作成することは良い方法でしょうか? このように、コントローラーはその特定の機能 (DB からのブログ投稿の取得など) のみを処理し、コントローラー拡張機能はすべての動的コンテンツを追加します。そうすれば、コントローラーの結果をキャッシュして、ページ全体をキャッシュせずにページを高速化できます (これは、多くの動的な HTML コンテンツのために実際には実行できません)。

このようなものかもしれません:

class ControllerExtension extends Controller
{
    public function render($view, array $parameters = array(), Response $response = null)
    {

        //get number of messages for this user
        $parameters['messages'] =

        //are they logged in
        $parameters['logged_in'] =

        // render as normal
        return parent::render($view, $parameters, $response);

    }
}

このため、JS の使用を無視したいと思います。これらのいくつかに JS を設定できることはわかっていますが、これは避けたいと思います。

4

1 に答える 1

4

これは、 ESIまたは Hinclude を使用してナビゲーション バー フラグメントをページ html から分離してキャッシュすることで解決でき、Symfony2 で簡単かつエレガントに解決できます。

テンプレート内にコントローラーを埋め込む

テンプレート内でコントローラーをレンダリングできます。

<div id="sidebar">
    {% render url('latest_articles', { 'max': 3 }) %}
</div>

latest_articlesこれにより、html 内のルート " " を持つコントローラーがレンダリングされます。

これは、コントローラー テンプレート、またはグローバル レイアウト テンプレート (すべてのページのヘッダー、フッター、js、css ecc を定義する場所、テンプレートの継承を参照)で実行できます。

ページの html とは別に、埋め込まれたフラグメントをキャッシュします。

リバース プロキシ ( VarnishAppCacheなど) を使用して、html の 2 つの部分を別々にキャッシュできます。

<div id="sidebar">
    {% render url('latest_articles', { 'max': 3 }, {'standalone': true}) %}
</div>

それだけです、追加するだけです{'standalone': true}

Web サーバーの前に外部プログラム (Varnish や mod を使用した Nginx など) が必要ですが、これが最速の方法です。

JavaScript を使用してフラグメントをロードします。

javascript でフラグメントを非同期にロードするように symfony に指示することもできます。

<div id="sidebar">
    {% render url('latest_articles', { 'max': 3 }, {'standalone': 'js'}) %}
</div>

html 全体を CDN にキャッシュし (Amazon CDN CloudFront などを使用)、ユーザー固有のコンテンツを引き続き表示できるため、これは優れたアプローチです。

情報については、http ://symfony.com/doc/2.1/book/templating.html#asynchronous-content-with-hinclude-js を参照してください。

于 2013-05-05T18:33:07.517 に答える