با کد ذیل صفحات ارور لاراول را به مسیر resource اضافه کنید
php artisan vendor:publish --tag=laravel-errors
همانطور که اشاره کردیم این بخش برای ارور های سمت وب بسیار عالی و کاربردی می باشد اما برای api، نمایش ارورهای 500 ، 404 ، 400 ، 401 و .... به صورت یک صفحه html خیلی غیر منطقی و نشانه ضعف و عدم آشنایی و همچنین عدم تسلط یک برنامه نویس برای نوشتن و توسعه یک api بی نقص می باشد. در این مطلب نحوه handle کردن ارورهای سمت api در لاراول را با یک مثال آموزش خواهیم داد.
هندل ارور های api لاراول
برای مدیریت exception error های لاراول یک فایل در مسیر app/exceptions به نام handler.php تعبیه شده است در این فایل می توانید exception هایی که نیازی به گزارش به کاربر ندارد را مشخص کنید یا نحوه render کردن یک ارور را مشخص کنید. در لاراول نوع درخواست ها را می توان تشخیص داد مثل درخواست های json که از سمت api برای سرور ارسال ارسال می شود. همچنین از سمت کلاینت همه درخواست ها باید دارای یک header به نام accept باشد کد ذیل
Accept: application/json
خب تمام این بازبینی ارورها باید در متد render انجام شود
public function render($request, Exception $exception)
{
if ($request->wantsJson()) { // چک کردن نوع درخواست که اگر جی سون باشدچه اتفاقی بیفتد
return $this->handleApiException($request, $exception);
} else {
$retval = parent::render($request, $exception);
}
return $retval; }
خب حالا متد handleApiException را داخل همین فایل تعریف می کنیم
private function handleApiException($request, Exception $exception)
{
$exception = $this->prepareException($exception);
if ($exception instanceof \Illuminate\Http\Exception\HttpResponseException) { // اگر ارور از نوع http بود
$exception = $exception->getResponse();
}
if ($exception instanceof \Illuminate\Auth\AuthenticationException) { // اگر ارور از نوع Auth بود
$exception = $this->unauthenticated($request, $exception);
}
if ($exception instanceof \Illuminate\Validation\ValidationException) { // اگر ارور از نوع اعتبار سنجی بود
$exception = $this->convertValidationExceptionToResponse($exception, $request);
}
return $this->customApiResponse($exception); }
در ادامه این ارور را به کمک تابع customApiResponse به صورت پیغام های دلخواه خود برگشت می دهیم
private function customApiResponse($exception)
{
if (method_exists($exception, 'getStatusCode')) {
$statusCode = $exception->getStatusCode();
} else {
$statusCode = 500;
}
$response = [];
switch ($statusCode) {
case 401:
$response['message'] = 'Unauthorized';
break;
case 403:
$response['message'] = 'Forbidden';
break;
case 404:
$response['message'] = 'Not Found';
break;
case 405:
$response['message'] = 'Method Not Allowed';
break;
case 422:
$response['message'] = $exception->original['message'];
$response['errors'] = $exception->original['errors'];
break;
default:
$response['message'] = ($statusCode == 500) ? 'Whoops, looks like something went wrong' : $exception->getMessage();
break;
}
if (config('app.debug')) {
$response['trace'] = $exception->getTrace();
$response['code'] = $exception->getCode();
}
$response['status'] = $statusCode;
return response()->json($response, $statusCode);
}
این کد تمام و کمال ارور های ایجاد شده سمت api را به دلخواه شما برگشت خواهد داد اما دو نکته را مد نظر قرار بدهید اول اینکه همه درخواست ها باید header اشاره شده accept را داشته باشند دوم برای جلوگیری از برگشت کامل ارور ها در فایل .env نوع APP_DEBUG را برابر false قرار دهید.