简体   繁体   English

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

[英]Return response from a kernel event listener

I'm using the OAuth2 Server Bundle and I want to authenticate the user for all methods in my controller. 我正在使用OAuth2服务器软件包 ,我想为我的控制器中的所有方法验证用户身份。 It's very similar to the use case done in the documentation How to Setup before and after Filters , except that I want to return the response instead of throwing an exception. 它与文档如何在过滤器之前和之后设置的用例非常相似,除了我想返回响应而不是抛出异常。

onKernelController with FilterControllerEvent gives me access to the controller so I can access OAuth2 Server Bundle's response method. 带有FilterControllerEvent onKernelController使我能够访问控制器,因此我可以访问OAuth2 Server Bundle的响应方法。 But I can't return any response in there. 但我不能在那里回复任何回应。 I can return a response in onKernelController using GetResponseEvent , but it gets called before onKernelController . 我可以使用GetResponseEventonKernelController返回响应,但是在onKernelController之前onKernelController

I looked into kernel.exception too but getResponse() returns different error messages so I rather not just throw an ambiguous exception. 我也查看了kernel.exceptiongetResponse()返回不同的错误消息,所以我不只是抛出一个模棱两可的异常。

What's the best practice for what I am trying to accomplish? 什么是我想要完成的最佳实践?

This is my code: 这是我的代码:

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));
}

In the EventListener Approach you can't return a response but you must set it on the event itself. 在EventListener方法中,您无法返回响应,但必须在事件本身上设置它。

The problem is that the Event FilterControllerEvent can't manage a returned response, so a better approach is to manage(listen for) the GetResponseForControllerResultEvent where you can set a response and stop the propagation. 问题是Event FilterControllerEvent无法管理返回的响应,因此更好的方法是管理(监听) GetResponseForControllerResultEvent ,您可以在其中设置响应并停止传播。

Hope this help. 希望这有帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM