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

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

دسته : فریم ورک لاراول

کد محصول : 78

قیمت : رایگان

laravel api error handle چیست؟ در یک پروژه web همراه با api، نمایش ارورهای سمت سرور در لاراول به صورت خروجی html می باشد این نوع خروجی برای سمت وب بسیار عالی می باشد و شما می توانید این صفحات ارور را شخصی سازی کنید با کد ذیل صفحات ارور لاراول را به مسیر resource اضافه کنید php artisan vendor:publish --tag=laravel-errors همانطور که اشاره کردیم این بخش برای ارور های سمت وب بسیار عالی و کاربردی می باشد اما برای api، نمایش ارورهای 500 ، 404 ، 400 ، 401 و .... به صورت یک صفحه html خیل...


laravel api error handle چیست؟ در یک پروژه web همراه با api، نمایش ارورهای سمت سرور در لاراول به صورت خروجی html  می باشد این نوع خروجی برای سمت وب بسیار عالی می باشد و شما می توانید این صفحات ارور را شخصی سازی کنید با کد ذیل صفحات ارور لاراول را به مسیر 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 قرار دهید.

 

  • api error handler - هندل ارور های api لاراول را با دوستان خود به اشتراک بگذارید.
  • سوالات خود را در بخش پرسش و پاسخ این مطلب ثبت کنید.
  • مطالب خود را در جاب تیم به اسم خود ثبت کنید ارسال مطلب


ثبت سوال/پاسخ
بهزاد میرزازاده
در مورد کاربر : همیشه سخت تلاش کردم و به موفقیت های خیلی زیادی رسیدم اما دلیل نشد که متوقف بشم من برای هر روز برنامه دارم و به امید موفقیت های بزرگتر قدم بر میدارم همیشه سخت ترین مسئله ها، ساده ترین راه حل رو دارند پس بهانه جویی نباید روش کار ما برنامه نویسان باشه!!! ما می توانیم آینده را تعیین کنیم
اشتراک گذاری این مطلب
{