api error handler - هندل ارور های api لاراول

api error handler - هندل ارور های api لاراول

laravel api error handle چیست؟ در یک پروژه web همراه با api، نمایش ارورهای سمت سرور در لاراول به صورت خروجی html  می باشد این نوع خروجی برای سمت وب بسیار عالی می باشد و شما می توانید این صفحات ارور را شخصی سازی کنید

زمان مطالعه: 3 دقیقه
بازدید: 1127
پرسش و پاسخ: 0

با کد ذیل صفحات ارور لاراول را به مسیر 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 قرار دهید.

بهزاد میرزازاده
مسیر درست با پرسش های درست ساخته می شود

مشاهده تمام مطالب نویسنده