Phần này mình sẽ giới thiệu với mọi người về report lỗi, và xử lý lỗi trong Laravel. Trong Laravel tất cả các error, exception đều chạy qua class App\Exceptions\Handler để làm nhiệm vụ ghi log rồi hiển thị đến người dùng.
1. Cấu hình.
Cấu hình debug
trong config/app.php
là tham số để quyết định việc có hiển thị thông tin lỗi đến người dùng hay không. Mặc định tham số này được xác định qua APP_DEBUG
trong file .env
, nếu là true
thì khi gặp lỗi Laravel sẽ hiển thị các thông tin của lỗi đó lên trên màn hình cho user và ngược lại nếu là false thì Laravel chỉ hiển thị status code là 500 trên màn hình cho user.
Demo màn hình report lỗi khi ở chế độ debug mode là true
Lưu ý: Các bạn chỉ nên bật mode debug khi ở trên môi trường local, hoặc dev thôi. Còn trên production tuyệt đối không bao giờ được để là true
. Vì như thế sẽ làm lộ ra các thông tin cấu hình trên ứng dụng của bạn.
2. Exception Handler.
Như mình đã nói ở trên, tất cả các exception đều được xử lý qua app/Exceptions/Handler.php
. Trong class này các bạn có thể khai báo các custom logic trong phương thức register, phương thức này sẽ rất hữu dụng nếu như bạn muốn sử dụng thêm một ứng dụng error tracking của bên thứ 3.
VD:
use App\Exceptions\InvalidOrderException;
/**
* Register the exception handling callbacks for the application.
*
* @return void
*/
public function register()
{
$this->reportable(function (InvalidOrderException $e) {
//
});
}
Ngoài ra bạn cũng có thể tùy chỉnh context của exception bằng cách overwrite lại phương thức context
trong class cha.
VD: Mình sẽ thêm URL gây ra lỗi vào context.
/**
* @inheritDoc
*/
protected function context()
{
return array_merge(parent::context(), [
'url' => URL::current(),
]);
}
Nếu như bạn muốn loại bỏ một exception nào đó, không muốn report exception nữa. Bạn có thể cấu hình trong $dontReport
property.
VD: Loại bỏ ProductNotFoundException
ra khỏi danh sách report.
/**
* A list of the exception types that are not reported.
*
* @var array
*/
protected $dontReport = [
ProductNotFoundException::class,
];
Mặc đinh, Laravel sẽ tự động convert các Exception về dạng HTTP response. Tuy nhiên, nếu như bạn cần custom response cho một exception nào đó bạn có thể sử dụng method renderable
.
VD: Mình sẽ render ra view errors.product_not_found
khi gặp ProductNotFoundException
.
/**
* Register the exception handling callbacks for the application.
*
* @return void
*/
public function register()
{
$this->renderable(function(ProductNotFoundException $exception) {
return response()->view('errors.product_not_found', [], 500);
});
}
Ngoài ra bạn muốn thay đổi các view error trong Laravel, bạn có thể tạo ra các view trong thư mục resources/views/errors
với tên là các mã lỗi tương ứng. Ví dụ: 404.blade.php
Hoặc bạn cũng có thể publish hết các error view trong core của Laravel ra thư mục resources/views/errors để chỉnh sửa cho tiện. Bạn có thể sử dụng câu lệnh.
php artisan vendor:publish --tag=laravel-errors
Trong trường hợp, bạn muốn render ra một view error nào đó mà không muốn raise exception trong đoạn code đó. Bạn có thể sử dụng hàm abort
với cú pháp.
abort($code, $message,$headers)
Trong đó:
$code
là mã http code mà bạn muốn reder ra.$message
là message mà bạn muốn reder ra kèm theo http code. Trường này có thể bỏ trống.$header
là các thông số header bạn muốn đẩy vào http response. Trường này có thể bỏ trống.
3. Lời kết.
Phần này mình chỉ giới thiệu với mọi người những gì liên quan đến exception handle thôi, còn các thứ khác như logging mình sẽ giới thiệu với mọi người trong một bài khác.
Đăng ký nhận tin.
Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!
stranger
4 năm trước