LaravelでAPIのValidationエラーをどこで返すか問題
Thu Jul 11, 2019 · 127 words

個人的見解

実処理

app/Exceptions/Handler.php

<?php
declare(strict_types=1);

// 省略

class Handler extends ExceptionHandler
{
    /**
    * @const string
    */
    const ROUTE_PREFIX = 'api';

    // 省略
    public function render($request, Exception $exception): void
    {
        if(collect(explode('/', $request->route()->getPrefix()))->first() === self::ROUTE_PREFIX ) {
            $this->apiReqponse($exception);
        }
    }

    // 省略
    private function apiResponse(Exception $exception): void
    {
        if ($exception instanceof ValidationException) {
            $this->throw($exception->errors(), 400);
        }

        // 他のexceptionを羅列することが可能
    }

    private function throw(array $errorMessage, int $code): void
    {
        throw new HttpResponseException(
            response()->json(
                [
                    'status' => 'fail',
                    'code' => $code,
                    'error_message' => $errorMessage
                ],
                $code
            )
        );
    }
}

返却値


{
    'status': 'fail,
    'code': 400,
    'error_message': {
        'field name': [
            'エラーです'
        ]
    }
}

余談

こっからは余談ですが、API の実装をしている基本的な返却形式は統一すべきだとおもってますし実際それは、スタンダードな考えだと思っています。今回Validationエラーに関して Handler でハンドリングを行うようにしたことによって統一できました。さらにいうとこれでテストの実装に関してはも形式が同じになったことにより楽になりました。

またこのハンドリングを他のExceptionにも対応させることによって利用者側に明確にどんなエラーかをこちらの意図で伝えることが可能になります。なのでどのレイヤーでも対応が可能になるかと。

似たように正常の処理に関しても trait にまとめることによってレスポンスに関しては、どこにどのように定義すべきかがわかるようになりますね。

trait を利用し getter, setter の要領で形式を統一可能です。

次回・・・・・・

気分が乗ったら実装例を晒したいと思います。


back · Top · About · Resume · Posts ·