2013-03-18 80 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

相關問題