2012-07-06 11 views
16

すべての呼び出しでJSONを返すREST Webサービスを構築しようとしています。通常、これは非常に簡単です、私はちょうどこのようにします:Symfony2コントローラのアクションで発生する可能性があるすべての例外をキャッチする方法は?

return new Response(json_encode($return_object)); 

私の質問は、私はグローバルな方法で例外をインターセプトする方法、ありますか?私はこれをやりたがっています。なぜなら、アプリケーション内で例外が発生した場合でも、JSONメッセージをクライアントに返すことが基本的には「基本的には例外です。 JSONを成功と失敗の両方で返すと、クライアントが自分のAPIを実装するために必要な作業が簡単になります。

これまでのところ、私は考えることができる唯一のことは、このようなすべてのコントローラのアクションを作成することです:

public function generateMemeAction($arg1, $arg2) { 
    $return_object = array(); 
    try { 
    // stuff to generate meme here 
    $return_object['status'] = "GREAT SUCCESS!"; 
    } catch (Exception $e) { 
    // epic fail 
    $return_object['status'] = "UnluckyBrianException"; 
    } 
    return new Response(json_encode($return_object)); 
} 

すべての偉大な、素晴らしいですが、それのtry-catchをブロックは、すべてのアクションのために同じになります私のアプリでは、私はコピーパスタの束の周りに編集する必要があるたびに愚かな気がします。プロのヒント?

答えて

17

RESTアプリにはさまざまな種類のエラーがあります。例えば。論理エラーまたは入力エラーを持つことができます(すべてのパラメータが送信されたわけではありません)。さまざまなタイプのエラーは、異なる方法を使用して処理する必要があります。その場合の最善の方法は、これらのエラーの手動処理です。

コントローラに特別なエラーメソッドを追加して(たとえば、親クラスに入れて)、エラーコード+エラーテキストを返すことができます。

しかし、あなたは自動処理を使用したい場合は、例外リスナーを使用することができます

:ここ

はサンプルです10

+5

恐ろしい!本当に物事をクリアするEvgenyありがとう。もう少し掘り下げて、そのイベントに関数をサブスクライブする方法を見つけました:http://symfony.com/doc/current/cookbook/service_container/event_listener.html – robertdfrench

+3

JSONフォーマットを条件付きで適用するには、リクエストを調べてヘッダーと初期の戻り値: 'if(!$ event-> getRequest() - > headers-> contains( 'Accept'、 'application/json'))return; – Tamlyn

関連する問題