Laravel 修改驗證異常的響應格式

Mr-houzi發表於2020-05-25

Laravel 預設驗證不通過後響應格式如下,有時此格式並不滿足自己要求,需要修改格式。


// status 422

{

    "message":"The given data was invalid.",

    "errors":{

        "url":[

            "url 無效的格式"

        ]

    }

}

當 Request 驗證失敗時會丟擲 ValidationException異常,最終交由全域性異常Handler類處理。Handler繼承自Illuminate\Foundation\Exceptions\Handler,框架中的Handler類呼叫render處理異常並進行響應,針對於ValidationException異常又呼叫了convertValidationExceptionToResponse方法來處理。程式碼


protected function convertValidationExceptionToResponse(ValidationException $e, $request)

{

    if ($e->response) {

        return $e->response;

    }

    return $request->expectsJson()

                ? $this->invalidJson($request, $e)

                : $this->invalid($request, $e);

}

expectsJson()區分是 ajax 請求還是表單請求,然後分別做處理。


protected function invalidJson($request, ValidationException $exception)

{

    return response()->json([

        'message' => $exception->getMessage(),

        'errors' => $exception->errors(),

    ], $exception->status);

}

追蹤到invalidJson(),發現他就是用來處理引數驗證異常響應格式的方法。在App\Exceptions\Handler類中,重寫invalidJson()方法即可。


protected function invalidJson($request, ValidationException $exception)

{

    return response()->json([

        'code' => 0,

        'data' => $exception->errors(),

    ], $exception->status);

}

最終,驗證失敗的響應格式如下


// status 422

{

    "code": 0,

    "data":{

        "url":[

            "url 無效的格式"

        ]

    }

}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章