2013-03-18 79 views
1

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

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

我知道我需要使用kernel.event_listener的kernel.request事件来重定向到一个URL。

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

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

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

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

有没有人得到同样的问题,并解决了。或者有没有更好的办法,我正在做什么?

+0

作为小提示:如果您从一个新项目开始,请使用Symfony2.2。 Symfony 2.0不再维护 – 2013-03-18 21:38:02

+0

谢谢。其实有2.1。我将编辑。 – Webghost 2013-03-18 21:49:17

回答

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

相关问题