Validating sự phụ thuộc attributes trong Laravel request Chuyên mục PHP và Laravel 2023-07-28 331 Lượt xem 79 Lượt thích 0 Bình luận

Có một kịch bản trong ứng dụng của bạn, trong đó có một số trường trong form của bạn phụ thuộc vào state (trạng thái) của một trường khác.
Chẳng hạn, hãy tưởng tượng một form có checkbox has_doctor_appointment, khi được chọn, checkbox này sẽ bật/tắt thông tin đầu vào về appointment_date và doctor_name. Người dùng có thể chọn checkbox, điền ngày và sau đó bỏ chọn checkbox. Đầu vào date không còn hiển thị, nhưng vẫn chứa một giá trị. Vì vậy, khi bạn gửi biểu mẫu, ngay cả khi đầu vào không hiển thị, giá trị vẫn được gán.
PR #30835 cho Laravel 6.x đã giải quyết vấn đề này. Trích dẫn từ chính PR
The goal of this PR is to make it easy to exclude attributes from a request based on the value of other attributes. This is useful when having to validate data from a form where certain checkboxes hide or show other inputs.
Đối với điều này, bạn cần sử dụng quy tắc exclude_if hoặc exclude_unless trên các trường phụ thuộc.
exclude_if & exclude_unless rules
Quy tắc xác thực exclude_if kiểm tra xem trường được xác thực có bị loại trừ khỏi dữ liệu yêu cầu được trả về bởi các phương thức validate và validated nếu trường otherfield bằng giá trị.
Đây là cách bạn viết validation rule.
'appointment_date' => 'exclude_if:has_appointment,false|required|date'
Và đây là ví dụ đầy đủ từ PR. Đối với dữ liệu bài viết như dưới đây:
// Post data:
{"has_appointment": false, "appointment_date": "2019-12-13"}
exclude_if sẽ được áp dụng như thế này.
public function post(Request $request)
{
$data = $request->validate([
'has_doctor_appointment' => 'required|bool',
'appointment_date' => 'exclude_if:has_appointment,false|required|date',
'doctor_name' => 'exclude_if:has_appointment,false|required|string',
]);
// $data === ['has_appointment' => false]
SomeModel::create($data);
}
Ở đây, trong ví dụ này, appointment_date và doctor_name sẽ bị bỏ qua nếu giá trị của has_doctor_appointment được set thành false.
Tương tự, Quy tắc xác exclude_unless khi kiểm tra xem trường được xác thực có bị loại trừ khỏi dữ liệu request được trả về bởi các phương thức validate và validated hay không, trừ khi anotherfield’s field khác bằng giá trị.


Bình luận (0)