根据用户状态重定向到不同的操作

时间:2013-03-18 21:27:21

标签: symfony event-handling

我正在使用Symfony 2.1。我想根据用户是否登录设置重定向例程。我检查它的方式是$User->isLoggedIn(),其中User是一项服务。

我想在控制器执行之前执行此操作。在Controller执行之前,我几乎没有其他事情发生。我使用kernel.controller的事件kernel.event_listener来做这些事情。但我意识到我无法使用此事件重定向到URL。

我知道我需要使用事件:kernel.event_listener的kernel.request才能重定向到URL。

问题。 我使用以下逻辑来确定是否需要重定向。

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

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

因此,在kernel.request事件中,$controler[0]不可用。在kernel.controller事件中,无法设置响应(将被忽略)。

有没有人遇到同样的问题并解决了。还是有更好的方法,我正在尝试做什么?

1 个答案:

答案 0 :(得分: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