Laravel: Mengubah Pesan Error 401 Unauthenticated

Laravel telah memiliki error handling yang luar biasa bagus. Semua pesan error yang ditunjukkan oleh Laravel mudah dipahami. Namun adakalanya kita perlu mengubah format pesan error tersebut agar sesuai dengan kebutuhan kita untuk membuat aplikasi. Ajaibnya ternyata Laravel juga menyediakan bagian ini dengan cara override pesan aslinya tanpa mengubah kodingan aslinya secara langsung.

Studi Kasus

Secara default, pesan error 401 Unauthenticated Laravel adalah sebagai berikut:

{"message":"Unauthenticated."}

Sedangkan format response sukses maupun error yang kubutuhkan adalah sebagai berikut:

{code, data, message}

Pada format response buatanku itu memiliki 3 key. yaitu:

  1. code digunakan untuk membedakan status response. Misal untuk membedakan valid atau tidak valid. Ini menjadi acuan utama
  2. data digunakan untuk mengirim data dari server berbentuk json. Defaultnya adalah array kosong.
  3. message digunakan untuk mengirimkan pesan error yang mudah dipahami manusia. Ini biasanya langsung diteruskan ke user untuk memberitahu status request yang dilakukannya.

Mengganti Format Error 401 Unauthenticated Laravel

Aku membuat fungsi untuk membuat format response API sesuai format yang aku sebutkan di atas. Fungsi tersebut adalah sebagai berikut:

function apiRespone( $code = 201, $data = [], $message = '' ) {
    return [
        'code'    => $code,
        'data'    => $data,
        'message' => $message
    ];
}

Fungsi tersebut kemudian aku gunakan untuk override pesan error default Laravel untuk 401 Unauthenticated. Caranya adalah dengan menambahkan fungsi unauthenticated pada app/Exceptions/Handler.php

 protected function unauthenticated($request, AuthenticationException $exception)
    {
        if ($request->expectsJson()) {
            return apiRespone(401, [], "Unauthenticated");
        }

        return redirect()->guest('login');
    }

Pada kodingan di atas dapat dilihat jika eksepektasi requestnya json maka akan ditampilkan pesan error format json. Namun jika tidak maka akan diarahkan ke halaman login.