Php Symfony 2.5:根据条件从任何页面重定向

Php Symfony 2.5:根据条件从任何页面重定向,php,redirect,response,event-listener,symfony-2.5,Php,Redirect,Response,Event Listener,Symfony 2.5,我正在开发一个自定义的“访问控制”,它与某些逻辑有关,而不是角色 如果在数据库中设置了特定选项,则用户可以继续,如果没有,则需要从系统中的任何位置重定向到某个页面,而不考虑方式(导航、直接URL等) 到目前为止,我已经创建了一个SecurityListener,它基本上通过onSecurityInteractiveLogin()方法从数据库中提取选项,并将它们存储在安全上下文中,这样我就可以随时随地访问它们。那部分工作正常 现在我不知道在哪里添加重定向逻辑。我正在考虑添加新的响应侦听器并修改on

我正在开发一个自定义的“访问控制”,它与某些逻辑有关,而不是角色

如果在数据库中设置了特定选项,则用户可以继续,如果没有,则需要从系统中的任何位置重定向到某个页面,而不考虑方式(导航、直接URL等)

到目前为止,我已经创建了一个SecurityListener,它基本上通过
onSecurityInteractiveLogin()
方法从数据库中提取选项,并将它们存储在安全上下文中,这样我就可以随时随地访问它们。那部分工作正常

现在我不知道在哪里添加重定向逻辑。我正在考虑添加新的响应侦听器并修改
onKernelResponse()
方法,但它似乎不起作用。这就是我到目前为止所做的:

在我的service.xml文件中,我对服务的描述如下:

<service id="response.listener" class="MyProj\UserBundle\EventListener\ResponseListener">
        <tag name="kernel.event_listener" event="response" method="onKernelResponse" />
        <argument type="service" id="security.context" />
        <argument type="service" id="session" />
        <argument type="service" id="router" />
    </service>


它实际上什么都没做。我是否遗漏了什么,是否使用了正确的方法?我愿意接受任何建议,谢谢。

不确定sf 2.5,但我认为您的事件名称应该是“kernel.response”,而不仅仅是“response”


另外,我更愿意使用kernelRequest而不是Response,这样您将保存一些最终不相关的进程。

不确定sf 2.5,但我认为您的事件名称应该是“kernel.Response”,而不仅仅是“Response”


另外,我更愿意使用kernelRequest而不是Response,因此您将保存一些最终不相关的进程。

尝试使用
AccessListener
如下:

class AccessListener
    {
    private$security;
    private $router;

    public function __construct($security, $router)
    {
        $this->security = $security;
        $this->router = $router;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        if ($this->security->isGranted('PINK_UNICORN')) {
            $url = $this->router->generate('pink_unicorn_totorial');
            $event->setResponse(new RedirectResponse($url));
        }
    }
}
将其添加到您的服务中。yml:

services:
  access_listener:
    class: Acme\DemoBundle\Listener\AccessListener
    arguments: [ @security.context, @router ]
    tags:
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

尝试以下方式使用
AccessListener

class AccessListener
    {
    private$security;
    private $router;

    public function __construct($security, $router)
    {
        $this->security = $security;
        $this->router = $router;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        if ($this->security->isGranted('PINK_UNICORN')) {
            $url = $this->router->generate('pink_unicorn_totorial');
            $event->setResponse(new RedirectResponse($url));
        }
    }
}
将其添加到您的服务中。yml:

services:
  access_listener:
    class: Acme\DemoBundle\Listener\AccessListener
    arguments: [ @security.context, @router ]
    tags:
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }