1
我想知道是否有辦法重定向所有請求,如果有條件。 例如,如果我有一個實體User with websiteDisabled = true的用戶。 據我所知,你不能從一個服務重定向。有沒有其他方法?Symfony2重定向所有請求
我想知道是否有辦法重定向所有請求,如果有條件。 例如,如果我有一個實體User with websiteDisabled = true的用戶。 據我所知,你不能從一個服務重定向。有沒有其他方法?Symfony2重定向所有請求
您想要創建偵聽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 }
謝謝您的回答!你認爲它可以使用:name:kernel.event_listener,event:kernel.controller? – mentalic