1

レガシーWebサイトをSF1.xからS2に変換中です。

古いコードには、SFv1フィルターチェーンを利用するクラスがあります。これはクラスのスニペットです:

class myFilter extends sfFilter
{
    public function execute($filterChain)
    {
        // Execute this filter only once
        if ($this->isFirstCall())
        {
            // Filters don't have direct access to the request and user objects.
            // You will need to use the context object to get them
            $context = $this->getContext();
            $user = $context->getUser();

            if ($user->isAuthenticated())
            {                
                // Do something
            }
        }

        // Execute next filter
        $filterChain->execute();
    }

}

この機能を実装できるようにしたい、つまりリクエストをスヌープし、ユーザーセッションに基づいてアクションを実行できるようにしたい。SFはフィルターチェーンを廃止したようで、Symfonyの内部に関するドキュメントを調べましたが、始めるのに役立つ何か(つまり、上記のような小さなスニペット)が見つかりません。

(v1のフィルターチェーンを介して実行できるように)要求をリッスンする方法を知っている人はいますが、SF2で提供される新しいメカニズムを使用していますか?

これを行う方法を示すスニペットをいただければ幸いです。

4

1 に答える 1

2

私は最初の Symfony を扱ったことはありませんが、イベント リスナーを探していると思います。特にonKernelRequest一つ。Listener クラスを作成し、それをサービスとして登録し、必要なものを注入するだけで準備完了です。

例えば:

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;

class RequestListener
{
    public function onKernelRequest(GetResponseEvent $event)
    {
        $response = new RedirectResponse('http://www.google.com');
        $event->setResponse($response);
    }
}

このリスナーは全員を Google にリダイレクトします。たとえば、メールを送信する必要がある場合は、このリスナーのサービスに SwiftMailer を挿入して、通常どおりに使用できます。Symfony2 のリスナーには、実行順序を調整できる優先順位もあります。

オプションの追加のタグ オプション優先度があり、デフォルトは 0 です。この値は -255 から 255 の範囲で指定でき、リスナーは優先度の順に実行されます。これは、あるリスナーが別のリスナーの前に実行されることを保証する必要がある場合に役立ちます。

もう 1 つの解決策がありますが、リスナーを使用するほど洗練されていません。ベースコントローラーを作成し、すべてのロジックをそのコンストラクターに入れることができます。他のすべてのコントローラーは、このコントローラーを拡張する必要があります (すべてのページで何かをしたい場合)。

于 2012-08-10T16:39:09.870 に答える