Controller của bạn đang làm sai việc

Mở controller của bạn ra. Tìm một method store.

Nó có tới 40 dòng code không? Bạn có thấy một khối validation khổng lồ, vài câu lệnh if, logic nghiệp vụ, và sau đó mới là một câu lệnh return không?

Controller của bạn đang làm những việc mà lẽ ra nó không nên làm.

Một controller chỉ có một nhiệm vụ duy nhất. Nó nhận một request, gọi một service để giải quyết vấn đề, và trả về một response. Nó là người phục vụ, chứ không phải đầu bếp.

Khi bạn đưa validation và authorization vào trong controller, nó sẽ trở nên hỗn loạn. Kết quả là bạn sẽ có 80 dòng code mà chẳng ai muốn đụng vào.

Laravel có một giải pháp tích hợp sẵn: Form Requests.

Một pattern xấu phổ biến trông như thế này:

  • Validate dữ liệu đầu vào
  • Kiểm tra quyền của người dùng
  • Chuyển đổi dữ liệu (Transforming data)
  • Thực thi logic nghiệp vụ (Business logic)

Điều này vi phạm Nguyên tắc Đơ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.

Sử dụng lệnh này để khắc phục: php artisan make:request StorePostRequest

Lệnh này sẽ tạo ra một file riêng biệt cho logic request của bạn. Hãy chuyển ba thứ sau vào Form Request:

  • Authorization: Sử dụng method authorize() để kiểm tra quyền.
  • 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 định dạng dữ liệu trước khi validate.

Bây giờ, hãy nhìn lại controller của bạn:

public function store(StorePostRequest $request)
{
    $post = Post::create($request->validated());
    return redirect()->route('posts.show', $post);
}

Controller bây giờ chỉ còn dài hai dòng. Nó lại đóng vai trò là một người phục vụ.

Laravel sẽ tự động chạy authorization và validation trước khi method của controller bắt đầu. Nếu validation thất bại, người dùng sẽ nhận được lỗi ngay lập tức.

Hãy tuân theo các hướng dẫn sau:

  • Giữ validation inline nếu nó ngắn và chỉ được sử dụng ở một nơi duy nhất.
  • Sử dụng Form Request nếu validation trở nên phức tạp, lặp lại, hoặc bao gồm cả authorization.
  • Không đưa business logic vào Form Request. Hãy sử dụng Service layer cho việc đó.

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ó thu gọn lại như thế nào.

Method store lớn nhất mà bạn từng thấy là bao nhiêu dòng? Hãy cho tôi biết ở phần bình luận nhé.

Nguồn: https://dev.to/denisgusto1/seu-controller-ta-fazendo-o-trabalho-do-form-request-e-ele-nao-devia-512o