Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从内核事件侦听器返回响应_Php_Symfony - Fatal编程技术网

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

Php 从内核事件侦听器返回响应,php,symfony,Php,Symfony,我使用的是OAuth2服务器包,我想对控制器中所有方法的用户进行身份验证。它与文档中的用例非常相似,只是我想返回响应,而不是抛出异常 onKernelControllerwithFilterControllerEvent允许我访问控制器,以便访问OAuth2服务器包的响应方法。但我不能在那里回复任何回复。我可以使用GetResponseEvent在onKernelController中返回响应,但它在onKernelController之前被调用 我也查看了kernel.exception,但是

我使用的是OAuth2服务器包,我想对控制器中所有方法的用户进行身份验证。它与文档中的用例非常相似,只是我想返回响应,而不是抛出异常

onKernelController
with
FilterControllerEvent
允许我访问控制器,以便访问OAuth2服务器包的响应方法。但我不能在那里回复任何回复。我可以使用
GetResponseEvent
onKernelController
中返回响应,但它在
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));
}

在EventListener方法中,您不能返回响应,但必须在事件本身上设置响应

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


希望这有帮助。

你已经看到了吗?没有。但这正是我不想做的。例如,在FilterController中抛出一个异常,并在OnKerneleException中拾取它。但这似乎是一种“正确”的方式。感谢您发布这篇文章。当然,问题是您无法设置您试图管理的事件的响应,请检查您是否可以管理
GetResponseForControllerResultEvent
事件。希望如此help@Matteo当前位置请随意将其作为答案发布,我将接受。似乎就是这样做的。不过要小心:
GetResponseForControllerResultEvent
仅在控制器未返回
响应
对象时才会触发。这也意味着无论事件侦听器在做什么,控制器总是被调用的,因为它只是在之后才被调用。