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

dan*_*son 5 php symfony

我正在使用OAuth2 服务器捆绑包,我想对控制器中的所有方法验证用户身份。它与文档如何在过滤器之前和之后进行设置中完成的用例非常相似中完成的用例非常相似,只是我想返回响应而不是抛出异常。

onKernelControllerwithFilterControllerEvent使我可以访问控制器,以便我可以访问OAuth2 Server Bundle 的响应方法。但我无法在那里回复任何回复。onKernelController我可以在using中返回响应GetResponseEvent,但它之前被调用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));
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*teo 4

在事件监听器方法中,您无法返回响应,但必须在事件本身上设置它。

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

希望这有帮助。

  • 但请注意:只有当控制器不返回“Response”对象时才会触发“GetResponseForControllerResultEvent”。这也意味着无论您的事件侦听器在做什么,控制器**总是**被调用,因为它只是在之后被调用。 (2认同)