Поле проверки проверки не пусто - PullRequest
0 голосов
/ 01 марта 2019

Мы пытаемся проверить одно или другое поле, второе поле появляется только тогда, когда они решили не заполнять первое.Таким образом, нам нужно только второе поле для проверки, если первое из них оставлено пустым, пропуская его.

Для контекста, чтобы проверить марку устройства, у нас есть список брендов / производителей, известных системе, но есть возможность написать его вручную, если ваш не появляется.Но нам нужно проверить, что поле ввода вручную не пустое, а только в том случае, если они пропустили первый список.

'single_item_make' => 'required_if:policy_type,single|required_if:single_item_make_other,',
'single_item_make_other' => 'required_if:policy_type,single|required_if:single_item_make,'

Мы попробовали описанное выше, и оно не сработало, мы, похоже, не можем найти в документации ничего о проверке полей на предмет пустоты.

Только одно из этих двух полей будет отправлено навремя.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Вы не можете объединить 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

Я не тестировал оба фрагмента кода, но они должны работать.

0 голосов
/ 01 марта 2019

Как следует из required_without документов, вы должны использовать его, как показано ниже:

'single_item_make' => 'required_if:policy_type,single|required_without:single_item_make_other,',
'single_item_make_other' => 'required_if:policy_type,single|required_without:single_item_make,'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...