Aplikasi web berbasis API semakin populer sekarang ini, dan cukup mudah dibuat di Laravel. Tetapi ada satu hal yang jarang dibahas yaitu adalah Exception Handling. Pengguna API sering menemukan response error API yang tidak dalam bentuk json dan sering sekali tidak memberikan pesan yang jelas. Jadi, bagaimana menangani kesalahan API dengan baik? Bagaimana cara mengembalikannya dalam bentuk json?

Cara yang saya lakukan adalah dengan memodifikasi file (app/Exceptions/Handler.php) di Laravel sehingga kita dapat mengubah response error menjadi berformat json sesuai dengan status codenya

<?php
public function render($request, Exception $exception)
    {

            return $this->handleApiException($request, $exception);
        //  return parent::render($request, $exception);

    }

    private function handleApiException($request, Exception $exception)
    {
        $exception = $this->prepareException($exception);

        if ($exception instanceof \Illuminate\Http\Exception\HttpResponseException) {
            $exception = $exception->getResponse();
        }

        if ($exception instanceof \Illuminate\Auth\AuthenticationException) {
            $exception = $this->unauthenticated($request, $exception);
        }

        if ($exception instanceof \Illuminate\Validation\ValidationException) {
            $exception = $this->convertValidationExceptionToResponse($exception, $request);
        }

        return $this->customApiResponse($exception);
    }
    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);
    }

Leave a Reply

Your email address will not be published. Required fields are marked *