1

私はSymfony2.1を使用しています。ユーザーがログインしているかどうかに応じてリダイレクトルーチンを設定したい。私がそれをチェックする方法は、サービスが$User->isLoggedIn()どこにあるかです。User

コントローラが実行される前にこれを実行したいと思います。Controllerが実行される直前に他に起こっていることはほとんどありません。私はevent:kernel.controllerofkernel.event_listenerを使用してそれらのことを行います。しかし、このイベントを使用してURLにリダイレクトできないことに気付きました。

URLにリダイレクトできるようにするには、kernel.event_listenerのevent:kernel.requestを使用する必要があることを理解しています。

問題。次のロジックを使用して、リダイレクトする必要があるかどうかを判断します。

if (!$controller[0] instanceof NoLogInNeededInterface) {

     if (!$User->isLoggedIn()) {
        //redirect here
     }
}

そのため、kernel.requestイベントで$controler[0]は、利用できません。そのkernel.controller場合、応答を設定できません(無視されます)。

誰かが同じ問題を抱えて解決しましたか?それとも、私がやろうとしていることを行うためのより良い方法はありますか?

4

1 に答える 1

1

kernel.event_listnerのkernel.exceptionイベントを使用することで、私が望んでいたことが達成できることに気づきました。

したがって、サービスでは:

my.service:
   class: MyBundle\EventListner\ExceptionListner
        tags:
           - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
        arguments: [ %logoutUrl% ]

次に、クラス自体で:

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

class ExceptionListner
{
    protected $_url;

    public function __construct($url)
    {
        $this->_url = $url;
    }

    public function onKernelException(GetResponseForExceptionEvent $event) {
        $exception = $event->getException();
        //dont necessarily need this condition
        if ($exception instanceof RedirectException) {
            $response = new RedirectResponse($this->_url);
            $event->setResponse($response);
        }
    }

}

これがより良いアプローチであるかどうかにかかわらず、私はまだ提案を待っています。これが苦労している人にも役立つことを願っています。P

于 2013-03-18T22:45:59.557 に答える