Вы не можете объединить required_if
с required_without
в этом случае, потому что оно конфликтует.
В вашем текущем коде первое правило для обоих:
required_if:policy_type,single
Для которого требуются оба поля, если policy_type === 'single'
, если 1 из полей пусто, эта проверка завершится неудачей.
Решением может быть использование сложной условной проверки, например:
$v = Validator::make($data, [
'policy_type' => [
'required',
'in:single,x,y', // ?
],
// some other static validation rules you have
]);
// conditional validation based on policy_type === 'single';
$v->sometimes('single_item_make', 'required_without:single_item_make_other', function ($input) {
return $input->policy_type === 'single';
});
$v->sometimes('single_item_make_other', 'required_without:single_item_make', function ($input) {
return $input->policy_type === 'single';
});
Это будет проверять только то, что оба не могут быть пустыми одновременно, и что одно поле является обязательным, когда другое поле пусто.
Однако это оставит возможность для пользователязаполнить оба.
Если вы хотите проверить, что оба не могут быть пустыми, но можно установить только 1 одновременно (xor), вам придется расширить свой валидатор какэто не существует в Laravel.
Поместите это в метод boot()
вашего AppServiceProvider:
Validator::extendImplicit('xor', function ($attribute, $value, $parameters, $validator) {
return empty($value) || empty(data_get($validator->getData(), $parameters[0]));
});
Тогда вы можете использовать:
$v->sometimes('single_item_make', 'required_without:single_item_make_other|xor:single_item_make_other', function ($input) {
return $input->policy_type === 'single';
});
$v->sometimes('single_item_make_other', 'required_without:single_item_make|xor:single_item_make', function ($input) {
return $input->policy_type === 'single';
});
В этом случаеrequired_without
гарантирует, что если 1 пусто, то требуется другое 1, а проверка xor
делает sЕсли 1 установлено, другое 1 не может иметь значение.
Вы можете добавить пользовательские сообщения об ошибках в свою проверку или использовать пользовательский валидатор и передать эти сообщения проверки там.
Ещеinfo: https://laravel.com/docs/5.7/validation#conditionally-adding-rules
Я не тестировал оба фрагмента кода, но они должны работать.