2013-07-16 58 views
1

我想知道是否有辦法重定向所有請求,如果有條件。 例如,如果我有一個實體User with websiteDisabled = true的用戶。 據我所知,你不能從一個服務重定向。有沒有其他方法?Symfony2重定向所有請求

回答

5

您想要創建偵聽kernel.request事件 (documentation here)的偵聽程序。在該聽衆中,您可以訪問請求 和容器,以便您可以做任何你喜歡的事情。在kernel.request Symfony給你一個GetResponseEvent

您可以在此事件上設置一個Response對象,就像您在控制器中返回響應 一樣。如果你確實設置了響應,Symfony將返回它並且不通過正常請求 - >控制器 - >響應循環去 。

namespace Acme\UserBundle\EventListener; 

use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpKernel\HttpKernel; 
use Symfony\Component\DependencyInjection\ContainerAware; 

class UserRedirectListener extends ContainerAware 
{ 
    public function onKernelRequest(GetResponseEvent $event) 
    { 
     if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) { 
      // don't do anything if it's not the master request 
      return; 
     } 

     $user = $this->container->get('security.context')->getToken()->getUser(); 

     // for example... 
     if ($user->websiteDisabled === false) { 
      return; 
     } 

     // here you could render a template, or create a RedirectResponse 
     // or whatever it is 
     $response = new Response(); 

     // as soon as you call GetResponseEvent#setResponse 
     // symfony will stop propogation and return the response 
     // no other framework code will be executed 
     $event->setResponse($response); 
    } 
} 

您還需要註冊事件監聽器在你的配置文件中的一個,對於 例如:

# app/config/config.yml 
services: 
    kernel.listener.your_listener_name: 
     class: Acme\UserBundle\EventListener\UserRedirectListener 
     tags: 
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 
+0

謝謝您的回答!你認爲它可以使用:name:kernel.event_listener,event:kernel.controller? – mentalic

相關問題