[laravel]ApiのエラーをhtmlからJSONにする

php/laravel


初期でのエラーの戻りですが、明確に記載が無い場所はhtmlでエラーが出力されてしまいます。

基本的なシステムのエラーをJSONにする修正は

「app\Exception\Handler.php」

をいじる事となります。まあ基本は公式を参考にする事とします。

https://readouble.com/laravel/9.x/ja/errors.html

認証エラー

認証エラーは、既にあるhandlerをオーバーライドします。

    use Illuminate\Auth\AuthenticationException;

    /**
     * Convert an authentication exception into an unauthenticated response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Auth\AuthenticationException  $exception
     * @return \Illuminate\Http\Response
     */
    protected function unauthenticated($request, AuthenticationException $exception)
    {
        // 認証エラーの場合
        return response()->json(['error' => 'Unauthenticated.'], Response::HTTP_UNAUTHORIZED);
    }

404エラー等の各エラーハンドリング

    /**
     * Register the exception handling callbacks for the application.
     *
     * @return void
     */
    public function register()
    {
        // 404の場合のエラー表示処理
        $this->renderable(function (NotFoundHttpException $e, $request) {
            if ($request->is('api/*')) {
                return response()->json([
                    'message' => 'not found record'
                ], Response::HTTP_NOT_FOUND);
            }
        });
    }

バリデーションによるエラー検出

バリデーションの個所はApiResponceを作り継承する形にする。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Response;

abstract class ApiRequest extends FormRequest
{
    /**
     * Handle a failed validation attempt.
     *
     * @param  Validator  $validator
     * @return void
     *
     * @throws HttpResponseException
     */
    protected function failedValidation(Validator $validator)
    {
        $data = [
            'message' => __('The given data was invalid.'),
            'errors' => $validator->errors()->toArray(),
        ];

        throw new HttpResponseException(response()->json($data, Response::HTTP_UNPROCESSABLE_ENTITY));
    }
}