如果有条件,我想知道是否有办法重定向所有请求。例如,如果我有一个 websiteDisabled = true 的实体用户。据我所知,您无法从服务重定向。还有其他方法吗?
问问题
2589 次
1 回答
5
您想创建一个侦听kernel.request
事件的侦听器(此处的文档)。在该侦听器中,您可以访问请求和容器,因此您可以做任何您喜欢的事情。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 }
于 2013-07-16T01:29:15.163 回答