Tập tành xử lý ngoại lệ Laravel Exception

2nd Nov 2022
Tập tành xử lý ngoại lệ Laravel Exception
Table of contents

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 đó.

Tập tành xử lý ngoại lệ Laravel Exception
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à

Tập tành xử lý ngoại lệ Laravel Exception

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

Methods thông dụng của collection trong laravel

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.

Bạn thấy bài viết này như thế nào?
1 reaction

Add new comment

Image CAPTCHA
Enter the characters shown in the image.

Related Articles

Mỗi kết nối cơ sở dữ liệu được định nghĩa trong một mảng, với tên kết nối là khóa của mảng

Eager Loading là một kỹ thuật tối ưu hóa truy vấn cơ sở dữ liệu trong Laravel, giúp tăng tốc độ truy vấn và giảm số lượng truy vấn cần thiết để lấy dữ liệu liên quan đến một bản ghi.

Để sử dụng Eager Loading với điều kiện trong Laravel, bạn có thể sử dụng phương thức whereHas hoặc orWhereHas trong Eloquent Builder.

E hiểu đơn giản vầy nha. auth() hay Auth trong laravel là những function global hay class, nó cũng chỉ là 1 thôi

Xin chào các bạn, tuần này mình sẽ viết một bài về cách xử lý Real Time(thời gian thực) với Laravel và Pusher