Indonesian (Bahasa Indonesia) translation by Sap (you can also view the original English article)
Dalam artikel ini, kita akan menjelajahi salah satu fitur yang paling penting dan paling sedikit dibahas dari Laravel web framework— exception handling. Laravel dilengkapi dengan built-in exception handler yang memungkinkan Anda untuk melaporkan dan membuat pengecualian dengan mudah dan ramah.
Di babak pertama artikel, kita akan menjelajahi pengaturan default disediakan oleh exception handler. Pada kenyataannya, kita akan pergi melalui default Handler class di tempat pertama untuk memahami bagaimana Laravel menangani exceptions.
Di babak kedua artikel, kita akan melanjutkan dan melihat bagaimana Anda bisa membuat custom exception handler yang memungkinkan Anda untuk mengerti custom exceptions.
Menyiapkan prasyarat
Sebelum kita melanjutkan dan menyelam ke Handler class lebih jauh, mari kita lihat beberapa parameter konfigurasi penting yang berkaitan dengan exceptions.
Silahkan membuka config/app.php
file. Mari kita melihat dari dekat potongan berikut.
1 |
...
|
2 |
...
|
3 |
/*
|
4 |
|--------------------------------------------------------------------------
|
5 |
| Application Debug Mode
|
6 |
|--------------------------------------------------------------------------
|
7 |
|
|
8 |
| When your application is in debug mode, detailed error messages with
|
9 |
| stack traces will be shown on every error that occurs within your
|
10 |
| application. If disabled, a simple generic error page is shown.
|
11 |
|
|
12 |
*/
|
13 |
|
14 |
'debug' => env('APP_DEBUG', false), |
15 |
...
|
16 |
...
|
Seperti namanya, jika sudah diatur ke TRUE
, ini akan membantu Anda untuk men-debug kesalahan yang dihasilkan oleh aplikasi. Nilai default dari variabel ini diatur ke nilai variabel APP_DEBUG
environment dalam .env
file.
Dalam development environment, Anda harus mengatur ke TRUE
sehingga Anda dapat dengan mudah melacak kesalahan dan memperbaikinya. Di sisi lain, Anda harus mematikannya saat production environment, dan akan menampilkan halaman kesalahan umum dalam hal ini.
Selain menampilkan kesalahan, Laravel memungkinkan Anda untuk log errors dalam log file. Mari kita lihat pilihan yang tersedia bagi logging. Sekali lagi, mari kita beralih ke config/app.php
file dan telah melihat dari dekat potongan berikut.
1 |
...
|
2 |
...
|
3 |
'log' => env('APP_LOG', 'single'), |
4 |
|
5 |
'log_level' => env('APP_LOG_LEVEL', 'debug'), |
6 |
...
|
7 |
...
|
Laravel menggunakan Monolog PHP library untuk logging, Anda harus mengatur opsi di atas dalam konteks library nya.
File log standar terletak di storage/logs/laravel.log
, dan cukup dalam kebanyakan kasus. Di sisi lain, APP_LOG_LEVEL
diatur ke nilai yang menunjukkan tingkat keparahan kesalahan yang akan didata.
Jadi itu pengenalan dasar pilihan konfigurasi yang tersedia untuk exceptions dan logging.
Selanjutnya, kita akan melihat default Handler class yang datang dengan default aplikasi Laravel. Lanjutkan dan buka app/Exceptions/Handler.php
file.
1 |
<?php
|
2 |
|
3 |
namespace App\Exceptions; |
4 |
|
5 |
use Exception; |
6 |
use Illuminate\Auth\AuthenticationException; |
7 |
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; |
8 |
|
9 |
class Handler extends ExceptionHandler |
10 |
{
|
11 |
/**
|
12 |
* A list of the exception types that should not be reported.
|
13 |
*
|
14 |
* @var array
|
15 |
*/
|
16 |
protected $dontReport = [ |
17 |
\Illuminate\Auth\AuthenticationException::class, |
18 |
\Illuminate\Auth\Access\AuthorizationException::class, |
19 |
\Symfony\Component\HttpKernel\Exception\HttpException::class, |
20 |
\Illuminate\Database\Eloquent\ModelNotFoundException::class, |
21 |
\Illuminate\Session\TokenMismatchException::class, |
22 |
\Illuminate\Validation\ValidationException::class, |
23 |
];
|
24 |
|
25 |
/**
|
26 |
* Report or log an exception.
|
27 |
*
|
28 |
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
|
29 |
*
|
30 |
* @param \Exception $exception
|
31 |
* @return void
|
32 |
*/
|
33 |
public function report(Exception $exception) |
34 |
{
|
35 |
parent::report($exception); |
36 |
}
|
37 |
|
38 |
/**
|
39 |
* Render an exception into an HTTP response.
|
40 |
*
|
41 |
* @param \Illuminate\Http\Request $request
|
42 |
* @param \Exception $exception
|
43 |
* @return \Illuminate\Http\Response
|
44 |
*/
|
45 |
public function render($request, Exception $exception) |
46 |
{
|
47 |
return parent::render($request, $exception); |
48 |
}
|
49 |
|
50 |
/**
|
51 |
* Convert an authentication exception into an unauthenticated response.
|
52 |
*
|
53 |
* @param \Illuminate\Http\Request $request
|
54 |
* @param \Illuminate\Auth\AuthenticationException $exception
|
55 |
* @return \Illuminate\Http\Response
|
56 |
*/
|
57 |
protected function unauthenticated($request, AuthenticationException $exception) |
58 |
{
|
59 |
if ($request->expectsJson()) { |
60 |
return response()->json(['error' => 'Unauthenticated.'], 401); |
61 |
}
|
62 |
|
63 |
return redirect()->guest(route('login')); |
64 |
}
|
65 |
}
|
Ada dua fungsi penting yang handler class bertanggung jawab untuk — pelaporan dan rendering semua errors.
Mari kita telah melihat dari dekat report
method.
1 |
/**
|
2 |
* Report or log an exception.
|
3 |
*
|
4 |
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
|
5 |
*
|
6 |
* @param \Exception $exception
|
7 |
* @return void
|
8 |
*/
|
9 |
public function report(Exception $exception) |
10 |
{
|
11 |
parent::report($exception); |
12 |
}
|
Report method digunakan untuk log errors ke log file. Pada saat yang sama, hal ini juga penting untuk dicatat dontReport
property, yang berisi daftar semua jenis pengecualian yang tidak boleh login.
Selanjutnya, mari kita membawa dalam render
method.
1 |
/**
|
2 |
* Render an exception into an HTTP response.
|
3 |
*
|
4 |
* @param \Illuminate\Http\Request $request
|
5 |
* @param \Exception $exception
|
6 |
* @return \Illuminate\Http\Response
|
7 |
*/
|
8 |
public function render($request, Exception $exception) |
9 |
{
|
10 |
return parent::render($request, $exception); |
11 |
}
|
Jika report
method yang digunakan untuk log atau report errors, render
method ini digunakan untuk membuat errors pada layar. Pada kenyataannya, method ini menangani apa yang akan ditampilkan kepada users ketika exception terjadi.
render
method juga memungkinkan Anda untuk menyesuaikan response untuk berbagai jenis exceptions, sebagaimana kita lihat dalam bagian berikutnya.
Akhirnya, method unauthenticated
menangani AuthenticationException
exception yang memungkinkan Anda untuk memutuskan apakah akan ditampilkan kepada users dalam kasus mereka sedang tidak terauthentikasi untuk mengakses halaman yang mereka cari.
Custom Excepiton Class
Pada bagian ini, kita akan membuat custom exception class yang menangani exceptions dari jenis CustomException
. Ide di balik menciptakan kelas kustom pengecualian adalah untuk mudah mengelola custom exceptions dan membuat custom responses pada waktu yang sama.
Lanjutkan dan buat file app/Exceptions/CustomException.php
dengan isi sebagai berikut.
1 |
<?php
|
2 |
|
3 |
namespace App\Exceptions; |
4 |
|
5 |
use Exception; |
6 |
|
7 |
class CustomException extends Exception |
8 |
{
|
9 |
/**
|
10 |
* Report the exception.
|
11 |
*
|
12 |
* @return void
|
13 |
*/
|
14 |
public function report() |
15 |
{
|
16 |
}
|
17 |
|
18 |
/**
|
19 |
* Render the exception into an HTTP response.
|
20 |
*
|
21 |
* @param \Illuminate\Http\Request
|
22 |
* @return \Illuminate\Http\Response
|
23 |
*/
|
24 |
public function render($request) |
25 |
{
|
26 |
return response()->view( |
27 |
'errors.custom', |
28 |
array( |
29 |
'exception' => $this |
30 |
)
|
31 |
);
|
32 |
}
|
33 |
}
|
Hal yang penting untuk dicatat di sini adalah bahwa CustomException
class harus memberikan inti Exception
class. Untuk keperluan demonstrasi, kita hanya akan membahas render method, tapi tentu saja Anda juga dapat menyesuaikan report method.
Seperti yang Anda lihat, kami akan mengarahkan pengguna ke halaman kesalahan errors.custom dalam kasus kami. Cara itu, Anda dapat menerapkan halaman custom error untuk jenis exceptions tertentu.
Tentu saja, kita perlu membuat file view terkait di resources/views/errors/custom.blade.php
.
1 |
Exception details: <b>{{ $exception->getMessage() }}</b> |
Itu cukup sederhana Lihat file yang menampilkan pesan error, tapi tentu saja Anda bisa desain seperti yang Anda inginkan.
Kita juga perlu untuk membuat perubahan dalam render method app/Exceptions/Handler.php
file sehingga custom exception class kami dapat dipanggil. Mari kita mengganti render method dengan isi sebagai berikut di app/Exceptions/Handler.php
file.
1 |
...
|
2 |
...
|
3 |
/**
|
4 |
* Render an exception into an HTTP response.
|
5 |
*
|
6 |
* @param \Illuminate\Http\Request $request
|
7 |
* @param \Exception $exception
|
8 |
* @return \Illuminate\Http\Response
|
9 |
*/
|
10 |
public function render($request, Exception $exception) |
11 |
{
|
12 |
if ($exception instanceof \App\Exceptions\CustomException) { |
13 |
return $exception->render($request); |
14 |
}
|
15 |
|
16 |
return parent::render($request, $exception); |
17 |
}
|
18 |
...
|
19 |
...
|
Seperti yang Anda lihat, kita memeriksa jenis exception dalam render method di tempat pertama. Jika jenis exception \App\Exceptions\CustomException
, kita memanggil render method dari class itu.
Jadi semuanya di tempat sekarang. Selanjutnya, mari kita lanjutkan dan buat controller file di app/Http/Controllers/ExceptionController.php
sehingga kita dapat menguji custom exception class.
1 |
<?php
|
2 |
namespace App\Http\Controllers; |
3 |
|
4 |
use App\Http\Controllers\Controller; |
5 |
|
6 |
class ExceptionController extends Controller |
7 |
{
|
8 |
public function index() |
9 |
{
|
10 |
// something went wrong and you want to throw CustomException
|
11 |
throw new \App\Exceptions\CustomException('Something Went Wrong.'); |
12 |
}
|
13 |
}
|
Tentu saja, Anda perlu menambahkan route yang terkait di routes/web.php
seperti yang ditunjukkan dalam potongan berikut.
1 |
// Exception routes
|
2 |
Route::get('exception/index', 'ExceptionController@index'); |
Dan dengan itu, Anda dapat menjalankan URL http://your-laravel-site.com/exception/index untuk melihat apakah ia bekerja seperti yang diharapkan. Ini harus menampilkan errors.custom
sesuai konfigurasi kami.
Jadi itulah bagaimana Anda seharusnya menangani custom exceptions dalam Laravel. Dan itu membawa kita ke akhir artikel ini-saya harap Anda telah menikmati itu!
Kesimpulan
Hari ini, kita melewati exception handling fitur di Laravel. Di awal artikel, kami mengeksplorasi konfigurasi dasar yang disediakan oleh Laravel untuk render dan report exceptions. Lebih lanjut, kita melihat singkat standar exception handler class.
Di babak kedua artikel, kami menyiapkan custom exception handler class yang menunjukkan bagaimana Anda bisa menangani custom exceptions dalam aplikasi Anda.
Bagi Anda yang baru mulai dengan Laravel atau mencari untuk memperluas pengetahuan Anda, situs, atau aplikasi dengan ekstensi, kami memiliki berbagai hal yang Anda dapat belajar di Envato Market.
Saya akan senang mendengar dari Anda dalam bentuk pertanyaan dan saran!