从内核事件侦听器返回响应

时间:2015-02-12 03:11:10

标签: php symfony

我正在使用 OAuth2服务器软件包,我想要为控制器中的所有方法验证用户身份。它与文档How to Setup before and after Filters中的用例非常相似,只是我想返回响应而不是抛出异常。

带有onKernelController

FilterControllerEvent可让我访问控制器,以便我可以访问 OAuth2 Server Bundle的响应方法。但我无法在那里回复任何回复。我可以使用onKernelControllerGetResponseEvent中返回回复,但会在onKernelController之前调用回复。

我也查看了kernel.exception,但getResponse()返回了不同的错误消息,所以我不只是抛出一个模棱两可的异常。

我想要完成的最佳做法是什么?

这是我的代码:

public function onKernelController(FilterControllerEvent $event)
{
    $controller = $event->getController();

    if ($controller[0] instanceof \Foo\Bundle\AuthBundle\Controller\TokenAuthenticatedController) {

        $server = $controller[0]->get('oauth2.server');
        $request = $controller[0]->get('oauth2.request');
        $response = $controller[0]->get('oauth2.response');

        if (!$server->verifyResourceRequest($request, $response)) {
            return $server->getResponse();
        }
    }
}

public function onKernelRequest(GetResponseEvent $event)
{
    $event->setResponse(new Response('Some response', 501));
}

1 个答案:

答案 0 :(得分:2)

在EventListener方法中,您无法返回响应,但必须在事件本身上进行设置。

问题是事件FilterControllerEvent无法管理返回的响应,因此更好的方法是管理(监听)GetResponseForControllerResultEvent,您可以在其中设置响应并停止传播。

希望得到这个帮助。