Проверка зависимых атрибутов в запросе Laravel


В вашем приложении возникает сценарий, когда в вашей форме есть несколько полей, которые зависят от состояния другого поля.

Например, представьте форму с has_doctor_appointment флажок, который при включении переключает appointment_date и doctor_name вход. Пользователь может установить флажок, ввести дату, а затем снять флажок. Введенная дата больше не видна, но все еще содержит значение. Поэтому, когда вы отправляете форму, даже если ввод не отображается, значение все равно публикуется.

Это пиар # 30835 для Laravel 6.x пытается решить эту проблему. Цитирование из самого пиара

Цель этого PR – упростить исключение атрибутов из запроса на основе значения других атрибутов. Это полезно, когда нужно проверить данные из формы, где определенные флажки скрывают или показывают другие входные данные.

Для этого вам нужно использовать exclude_if или exclude_unless правила проверки на зависимых полях.

exclude_if & exclude_unless правила

exclude_if правило проверки проверяет, будет ли проверяемое поле исключено из данных запроса, возвращаемых validate и validated методы, если anotherfield поле равно значению.

Так вы бы написали правило проверки.

'appointment_date' => 'exclude_if:has_appointment,false|required|date'

А вот полный пример из пиара.

Для публикации данных, как показано ниже:

// Post data:
{"has_appointment": false, "appointment_date": "2019-12-13"}

exclude_if будет применяться как так.

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);
}

Здесь, в этих примерах, appointment_date и doctor_name будет игнорироваться, если значение has_doctor_appointment установлен в false,

Точно так же exclude_unless правило проверки проверяет, будет ли проверяемое поле исключено из данных запроса, возвращаемых validate и validated методы, если anotherfieldПоле равно значению.