2015-02-12 66 views
2

我正在使用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)); 
} 
+0

你已經看到[這篇文章](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

+0

不,我沒有。但這正是我不想做的。我在'onFilterController'中拋出一個異常,並在'onKernelException'中撿起它。但似乎這是做到這一點的「正確」方式。感謝您發表文章。 – 2015-02-12 06:31:21

+0

這個問題當然是因爲你不能在你嘗試管理的事件上設置響應,請檢查你是否可以管理'GetResponseForControllerResultEvent'事件。希望這可以幫助 – Matteo 2015-02-12 07:28:18

回答

2

在事件監聽方法,你不能返回的響應,但你必須把它放在了事件本身。

問題是事件FilterControllerEvent無法管理返回的響應,因此更好的方法是管理(監聽)GetResponseForControllerResultEvent,您可以在其中設置響應並停止傳播。

希望得到這個幫助。

+1

請注意:'GetResponseForControllerResultEvent'只會被** **如果Controller沒有返回一個'Response'對象。這也意味着無論您的事件偵聽器在做什麼,Controller都是**總是被調用的,因爲它僅在之後被調用。 – netmikey 2016-02-10 10:49:21