18

すべての呼び出しに対して JSON を返す REST Web サービスを構築しようとしています。通常、これは非常に簡単です。私は次のようにします。

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 ブロックはアプリ内のすべてのアクションで同じであり、たくさんのコピー パスタを編集する必要があるたびにばかげていると感じます。プロのヒント?

4

1 に答える 1

19

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

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

ただし、自動処理を使用する場合は、例外リスナーを使用できます。

以下にサンプルを示します。

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

public function onKernelException(GetResponseForExceptionEvent $event)
{
    $exception = $event->getException();
    $response = new Response();
    // setup the Response object based on the caught exception
    $event->setResponse($response);

    // you can alternatively set a new Exception
    // $exception = new \Exception('Some special exception');
    // $event->setException($exception);
}
于 2012-07-06T23:03:14.867 に答える