Validation nên đặt logic xử lý ở đâu cho hợp lý?

nếu làm laravel chắc các bạn cũng biết nó có cung cấp cho mình các class hỗ trợ việc validate dữ liệu, thường đối với các form dữ liệu đơn giản thì mình sẽ làm thế này:

tạo 1 class FormRequest
trong controller sẽ để biến $reques map đến cái class FormRequest, sau khi validate thành công thì mới cho chạy vào logic của controller
Capture
Capture

nhưng đó là với nhưng form đơn giản nếu form phức tạp khi mà việc kiểm tra dữ liệu cần querry đến nhiều bảng trong database rồi việc logic nữa thì, nên viết sao cho nó clear?
hiện giờ mình đang viết theo kiểu này
Capture

logic và querry database mình viết luôn tại controller, tất nhiên các querry + logic mình sẽ tách vào các class Service , tại controller chỉ gọi ra thôi, như thế có clear ko? còn cách nào clear hơn ko?

Mình luôn viết validation trong FormRequest.
Xử lý validate phức tạp thì dùng dynamic rules thôi.
VD:

rules()
{
    $is_valid = is_valid( request()->id ); // Một xử lý validate phức tạp
    if ($is_valid) {
        return []; // passed rồi nên không cần check gì thêm
    } else {
        return [
            'id' => 'bail|required|failed_now'; // failed_now là một custom rule, luôn luôn trả về false
        ];
    }
}

Nếu bạn muốn giữ lại các data đã được tính toán (hoặc truy vấn sẵn) trong FormRequest để tái sử dụng trong controller, thì có thể gán data đó vào $request

rules()
{
    ...
    $this->merge(['validated_data' => $validated_data]);
    // Trong controller sẽ truy cập bằng $request->validated_data;
}
3 Likes

vậy tại dynamic rule của bạn sẽ thực hiện các câu lệnh select table, join table, thì bạn sẽ truyền service vào như thế nào

Thì gọi tới các function thực hiện select table, join table thôi, truyền tham số từ request vào.
Các service hay gì thì cũng là các Class theo hướng đối tượng mà thôi.
Bạn hỏi lạ, code của bạn mà lại đi hỏi mình.
Mình chỉ gợi ý ý tưởng, còn implement như thế nào là việc của mỗi người.

Thấy cái hàm is_valid() không, nó là cả một bầu trời trong đó.
Bạn muốn check cái gì trong đó, là tùy thuộc vào bạn.

2 Likes

à cho mình hỏi thêm, nếu mình rơi vào trường hợp các fields muốn validate nó có mối quan hệ validate với nhau thì làm cách nào
vd:
field1 >> yêu cầu là kiểu email,là tồn tại duy nhất
field2 >> nếu field1 thỏa rồi mới kiểm tra các trường hợp ở field2

mình hỏi như vậy vì, trong các điều kiện kiểm tra của field2 bắt buộc field1 phải thỏa các điều kiện đó, mà do bình thường validate nó sẽ chạy riêng rẽ từng cái , nên tại lúc kiểm tra field2 mình lại phải kiểm tra lại xem field1 có thỏa không sẽ bị lặp 2 lần

Mình thì không biết OOP, MVC cũng như Laravel, nhưng mình cũng thường hay gặp bài này trong thực tế nên dùng một mảng 1 chiều hoặc mảng 2 chiều và tick vào đó. Trước khi kiểm tra một trường mà có ràng buộc trường khác thì soi vào mảng/ ma trận xem ở đó nó như thế nào. Nếu ở đó thoả hoặc không thoả theo ý bạn thì mới thực hiện việc gì đó tiếp theo. Hoặc lần lượt đó là khi 1 không thoả thì không nhảy sang kiểm tra 2, buộc phải lần lượt giải quyết 1 cái đã (tức khi kiểm tra 1 thì set một biến liền, đến 2 nếu biến đó là false thì khỏi làm gì), cho nên sẽ không xảy ra chuyện ở 2 phải kiểm về 1.

1 Like

Form validation thì cứ làm giống như ở trên, required/format/… (không xét ngữ nghĩa)
Còn về ngữ nghĩa thì validate trong lúc xử lý, nếu có lỗi thì throws/handle thôi

bạn nên phân biệt các layer của việc validation này.
nhưng nhìn chung là trong lúc làm việc thì define cho project một bộ rule, (trả về lỗi tìm thấy đầu tiên/full list lỗi, trả về lỗi http trong code / lỗi trong response (http code success)…)

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?