Controller của bạn đang làm quá nhiều việc
Mở controller của bạn ra. Nhìn vào method store của bạn xem.
Nó có dài tới 40 dòng code không? Nó có bắt đầu bằng một khối validation khổng lồ, tiếp theo là hàng loạt câu lệnh if, rồi đến logic nghiệp vụ, và cuối cùng mới là một lệnh return?
Controller của bạn đang làm những việc không thuộc trách nhiệm của nó.
Một controller chỉ có một vai trò đơn giản. Nó nhận một request, gọi một service để giải quyết vấn đề, và trả về một response. Hãy coi nó như một người bồi bàn. Người bồi bàn mang thức ăn đến cho bạn, chứ họ không nấu ăn.
Khi bạn đưa validation, authorization và xử lý dữ liệu vào bên trong một controller, nó sẽ trở nên hỗn loạn. Bạn sẽ kết thúc với một "con quái vật" dài 80 dòng mà không ai muốn đụng vào.
Laravel có một giải pháp tích hợp sẵn: Form Requests.
Đừng lặp lại logic validation và authorization trong mọi method nữa. Hãy sử dụng Nguyên lý Đơn trách nhiệm (Single Responsibility Principle). Một class chỉ nên có duy nhất một lý do để thay đổi. Một controller thay đổi khi luồng request thay đổi. Nó không nên thay đổi chỉ vì một quy tắc validation thay đổi.
Chạy lệnh này để tạo một class request chuyên dụng:
php artisan make:request StorePostRequest
Hãy chuyển logic của bạn vào class mới này. Một Form Request xử lý ba việc chính:
• Authorization: Sử dụng method authorize để quyết định xem người dùng có được phép thực hiện một hành động hay không. Nếu nó trả về false, Laravel sẽ tự động gửi lỗi 403.
• Validation: Sử dụng method rules để định nghĩa các yêu cầu về dữ liệu.
• Data Preparation: Sử dụng prepareForValidation để làm sạch hoặc biến đổi dữ liệu trước khi quá trình validation diễn ra. Điều này cực kỳ hữu ích để tạo slug hoặc chuẩn hóa số điện thoại.
Sau khi chuyển logic này đi, controller của bạn sẽ gọn nhẹ hơn. Nó có thể trông như thế này:
public function store(StorePostRequest $request)
{
$post = Post::create($request->validated());
return redirect()->route('posts.show', $post);
}
Chỉ vậy thôi. Hai dòng code.
Controller vẫn giữ được sự tinh gọn vì Laravel thực hiện validation và authorization trước khi method được bắt đầu. Nếu dữ liệu sai, người dùng sẽ nhận được lỗi ngay lập tức.
Một lời cảnh báo. Đừng sử dụng Form Requests cho mọi thứ. Nếu bạn có một route cực nhỏ với chỉ một trường dữ liệu đơn giản, hãy giữ validation ngay tại chỗ (inline). Chỉ sử dụng Form Requests khi logic trở nên phức tạp, lặp lại hoặc liên quan đến quyền hạn.
Ngoài ra, đừng đưa logic nghiệp vụ vào Form Request. Các phép tính toán và cập nhật cơ sở dữ liệu nên thuộc về lớp Service (Service layer).
Hãy tìm controller lộn xộn nhất của bạn ngay hôm nay. Trích xuất phần validation vào một Form Request. Và xem nó trở nên gọn gàng như thế nào.
Method store lớn nhất mà bạn từng thấy là gì? Hãy cho tôi biết dưới phần bình luận nhé.
Source: https://dev.to/denisgusto1/seu-controller-ta-fazendo-o-trabalho-do-form-request-e-ele-nao-devia-512o
