我正在使用OAuth2服務器軟件包我想對我的控制器中的所有方法進行身份驗證。它與文檔How to Setup before and after Filters中的用例非常相似,只是我想返回響應而不是拋出異常。來自內核事件監聽器的返回響應
onKernelController
使用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));
}
你已經看到[這篇文章](http://php-and-symfony.matthiasnoback.nl/2012/12/prevent-controller-execution-with-annotations-and-return-a-custom-response/ )? – Matteo 2015-02-12 05:55:40
不,我沒有。但這正是我不想做的。我在'onFilterController'中拋出一個異常,並在'onKernelException'中撿起它。但似乎這是做到這一點的「正確」方式。感謝您發表文章。 – 2015-02-12 06:31:21
這個問題當然是因爲你不能在你嘗試管理的事件上設置響應,請檢查你是否可以管理'GetResponseForControllerResultEvent'事件。希望這可以幫助 – Matteo 2015-02-12 07:28:18