Laravel Tutorial

Bài 20: 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

'debug' => (bool) env('APP_DEBUG', false),

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

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

Ví dụ

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

Ví dụ: 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

Ví dụ: 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

Ví dụ: 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

 

Leave a Comment