Laravel Exception: Xử lí ngoại lệ (Phần 1)

1. Giới thiệu

Chúng ta thường chưa quan tâm đầy đủ về vấn đề lỗi. Khi phát sinh lỗi, chương trình thường chỉ trả ra mặc định kiểu "Whoops, something went wrong" hay thậm chí trả về exception. Điều này không hữu ích đối với người dùng cơ bản, khiến việc trải nghiệm trang web thật tệ.

Vì thế, bài viết này mình xin cung cấp thông tin và trình bày về ví dụ về một bài toán cụ thể về cách xử lí ngoại lệ (Laravel Exception: Handle, Catch).

2. Bài toán tìm kiếm user

  1. Chuẩn bị

Bài toán tìm kiếm user cho phép nhập vào ID và trả về thông tin của user đó.

Route::get('/users', 'UserController@index')->name('users.index'); Route::post('/users/search', 'UserController@search')->name('users.search');
Khai báo routes
class UserController extends Controller
{

    public function index()
    {
        return view('users.index');
    }

    public function search(Request $request)
    {
        $user = User::find($request->input('user_id'));
        return view('users.search', compact('user'));
    }

}
UserController
form action="{{ route('users.search') }}" method="POST">
@csrf
<div class="form-group">
<input id="user_id" class="form-control" name="user_id" type="text" value="{{ old('user_id') }}" placeholder="User ID">
</div>
<input class="btn btn-info" type="submit" value="Search">
</form>
find.blade.php

Khi tìm thấy user, màn hình sẽ trả về thông tin của user đó. Nếu ID không hợp lệ, hoặc không có user nào có ID như vậy.

2. Xử lí ngoại lệ

Khi không có user sẽ xuất hiện lỗi

Trying to get property of non-object

Tất nhiên chúng ta có thể set APP_DEBUG=false và trình duyệt chỉ xuất hiện thông báo lỗi "Some thing went wrong".

Với hàm findOrFail() trong trường hợp không tìm thấy user sẽ trả về một ModelNotFoundException, do đó chúng ta cần phải bắt lỗi

public function search(Request $request)
{
    try {
        $user = User::findOrFail($request->input('user_id'));
    } catch (ModelNotFoundException $exception) {
        return back()->withError($exception->getMessage())->withInput();
    }
    return view('users.search', compact('user'));
}
Xử lí ngoại lệ hàm search

Khi đó màn hình nhận được là

Kết quả

Tuy nhiên, không nên để người dùng thấy những message như trên. Nên chúng ta sẽ custom lại chúng như sau

return back()->withError('User not found by ID ' . $request->input('user_id'))->withInput();
Custom message
Kết quả

3. Tổng kết

Như vậy chúng ta đã đi qua cơ bản về cách xử lí ngoại lệ. Trong phần tiếp theo, mình sẽ giới thiệu với mọi người cách đưa chúng vào trong Service sử dụng Dependency Injection và tạo Exception Class riêng của mình.