😗

APIでエラー発生時に共通のレスポンスを返す(laravel)

2021/06/21に公開

エラー発生した際に、何もしなければexceptionの内容がレスポンスで返されてしまいます。
それだとフロント側にとっては何がなんだかわからないので、エラー発生時のレスポンスの形式を統一して返したいです。

Laravelではシステム内のエラーをキャッチしてくれる優秀な Handler.php さんがいます。
Handler.php でエラーをexceptionごとにキャッチして形式を整えてレスポンスを返せばいいという風になります。

例えば、 Handler.php でこのように記述すると

public function render($request, Throwable $exception)
{
    if ($exception instanceof UnauthorizedHttpException) {
        response()->json([
                'errMsg'   => '認証エラーが発生しました。再度ログインしなおしてください。'
            ], 401);
    }

    return parent::render($request, $exception);
}

UnauthorizedHttpException(認証が必要な処理なのに未認証ですよエラー)が発生した場合に、ステータスコードを「401」、 内容は errMsg => '認証エラーが発生しました。再度ログインしなおしてください。' という形で返しています。

これであれば、フロント側で401エラーが来たら未認証エラーだから、errMsgの内容を画面に表示してあげればいいのか!とキャッチする処理が楽になります。

今回は UnauthorizedHttpException を例にしてみましたが、 500のサーバーエラーや何でもいいから全てのエラーをキャッチするということもできますし、もちろんご自身で作られたカスタム例外もキャッチできます。

システム内で発生したエラーはきちんと整えてレスポンスを返しましょうという話でした。

Discussion