2016-08-25 9 views
0

投稿者this example私は、コントローラアクションが処理される前に、APIエンドポイント(つまり/ api/v1)へのすべてのリクエストを解析するために、以下のListener/Before Filterを設定することができました。これは、要求タイプを検証し、特定の条件が満たされない場合にエラーをスローするために使用されます。Symfony:Before Filter(Listener)からJSONレスポンスを返す方法は?

私はアプリケーションの環境状態に基づいてエラー応答を区別したいと思います。私たちが開発やテストをしている場合は、遭遇したエラーを投げたいだけです。また、プロダクションモードでJSONレスポンスとしてエラーを返したい場合は、これは可能ですか?もしそうでなければ、どうすれば似たようなことができますか?

私はSymfony v3.1。*を使用しています。違いがあれば。

namespace AppBundle\EventListener; 

use AppBundle\Interfaces\ApiAuthenticatedController; 
use Symfony\Component\HttpKernel\Event\FilterControllerEvent; 
use Symfony\Component\DependencyInjection\ContainerInterface; 
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; 

class ApiBeforeListener 
{ 
    /** 
    * @var \Symfony\Component\DependencyInjection\ContainerInterface 
    */ 
    protected $container; 

    public function __construct(ContainerInterface $container) 
    { 
     $this->container = $container; 
    } 

    /** 
    * Validates a request for API resources before serving content 
    * 
    * @param \Symfony\Component\HttpKernel\Event\FilterControllerEvent $event 
    * @return mixed 
    */ 
    public function onKernelController(FilterControllerEvent $event) 
    { 
     $controller = $event->getController(); 

     if (!is_array($controller)) 
      return; 

     if ($controller[0] instanceof ApiAuthenticatedController) { 

      $headers = $event->getRequest()->headers->all(); 

      // only accept ajax requests 
      if(!isset($headers['x-requested-with'][0]) || strtolower($headers['x-requested-with'][0]) != 'xmlhttprequest') { 

       $error = new AccessDeniedHttpException('Unsupported request type.'); 

       if (in_array($this->container->getParameter("kernel.environment"), ['dev', 'test'], true)) { 
        throw $error; 
       } else { 
        // return json response here for production environment 
        // 
        // For example: 
        // 
        // header('Content-Type: application/json'); 
        // 
        // return json_encode([ 
        // 'code' => $error->getCode(), 
        // 'status' => 'error', 
        // 'message' => $error->getMessage() 
        // ]); 
       } 
      } 
     } 
    } 

} 

答えて

1

ほとんどのイベントとは異なり、FilterControllerEventでは応答オブジェクトを返すことはできません。もしそれがうまくいけばいいけど、ああ。

基本的な選択肢は2つあります。

例外は例外をスローして例外リスナーを追加するのが最も良い方法です。例外リスナーは、環境に基づいてJsonResponseを返すことができます。

あなたのJsonResponseを返すだけのコントローラを作成し、次にそれを指すために$ event-> setController($ jsonErrorController)を使用することもできます。

しかし、私は例外をスローすることがおそらくあなたの最善の策だと思います。

詳細はこちらhttp://symfony.com/doc/current/reference/events.html

+0

@Caredあなたの最初の提案は良いアイデアのように聞こえます。私はそれに行くと報告を返すよ。 –

関連する問題