Tập tành xử lý ngoại lệ Laravel Exception
2nd Nov 20221. 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à
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
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.
- 2 views
Add new comment