2017-05-17 8 views
0

私はこのパターンを使用して、コントローラのフィルタを実装しています::: CONTROLLER加入者

http://symfony.com/doc/current/event_dispatcher/before_after_filters.html#creating-an-event-listener

しかし、代わりに私が応答を返すしたいHTTP例外をスローします。

どうすればいいですか? SF2で最も良い/最も受け入れられる方法は何ですか? kernel.controllerのこのレベルで

public function onKernelController(FilterControllerEvent $event) 
{ 
    if (!$event->isMasterRequest()) { 
     return; 
    } 

    $controller = $event->getController(); 

    // $controller passed can be either a class or a Closure. 
    // This is not usual in Symfony but it may happen. 
    // If it is a class, it comes in array format 
    if (!is_array($controller)) { 
     return; 
    } 

    if ($controller[0] instanceof ResourceServerAuthorizedController) { 
     $request = $event->getRequest(); 

     $response = $this->resourceServer->authorize($request); 
     if (!$response->isOk()) { 
      return $response; // ??? HERE 
     } 
    } 
} 
+0

は、戻りの$ response'が応答である '、理解しないでください。あるいは別のレスポンスを作成する '新しいレスポンスを返す( 'No authorized')' – COil

答えて

1

ます(このためにあなたがkernel.responseを必要とし、あなたがはsetResponse方法 使用する必要があります応答を操作することはできません - 「はしかし、あなたができるのコントローラーのタイプを確認してください)。 あなたは本当にあなたがこのケースで何ができるか、コントローラの種類が任意の呼び出し可能とコントローラを変更している必要がある場合:

$replacementController = new ReplacementController(); 
$event->setController($replacementController->getReplacementMethod()); 

・ホープこれはあなたの質問に答えます。

1

何らかの理由でレスポンスを操作したい場合、いくつかの一般的なロジックを持つ以下のようなことができます。あなたはそれでやりたいことを実行する必要があります。

onKernelControllerhttp://www.inanzzz.com/サイトで検索すると、7つの例が使用されています。

services: 
    application_frontend.listener.player: 
     class: Application\FrontendBundle\Listener\PlayerListener 
     tags: 
      - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } 

LISTENER

use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpKernel\Event\FilterControllerEvent; 

.... 

    public function onKernelController(FilterControllerEvent $event) 
    { 
     if (!$event->isMasterRequest()) { 
      return; 
     } 

     $controller = $event->getController(); 
     if (!is_array($controller)) { 
      return; 
     } 

     if (!$controller[0] instanceof YourController) { 
      return; 
     } 

     $message = 'Bye inanzzz'; 

     $event->setController(
      function() use ($message) { 
       return new Response($message, 200); 
      } 
     ); 
    } 

.... 
関連する問題