Обязательное поле, только если другое поле имеет значение, в противном случае должно быть пустым

Мой вопрос касается правил проверки Laravel.

У меня есть два входа a и b. a — это выбор ввода с тремя возможными значениями: x, y и z. Я хочу написать это правило:

b должен иметь значение только если a values ​​равно x. В противном случае b должен быть пустым.

Есть ли способ написать такое правило? Я пробовал required_with, required_without, но, кажется, это не может покрыть мой случай.

Другими словами, если предыдущее объяснение было недостаточно ясным:

  • Если a == x, b должно иметь значение.
  • Если a != x, b должно быть пустым.

person rap-2-h    schedule 24.01.2018    source источник


Ответы (3)


Вы должны создать свое собственное правило проверки.

Отредактируйте app/Providers/AppServiceProvider.php и добавьте это правило проверки в метод boot:

// Extends the validator
\Validator::extendImplicit(
    'empty_if',
    function ($attribute, $value, $parameters, $validator) {
        $data = request()->input($parameters[0]);
        $parameters_values = array_slice($parameters, 1);
        foreach ($parameters_values as $parameter_value) {
            if ($data == $parameter_value && !empty($value)) {
                return false;
            }
        }
        return true;
    });

// (optional) Display error replacement
\Validator::replacer(
    'empty_if',
    function ($message, $attribute, $rule, $parameters) {
        return str_replace(
            [':other', ':value'], 
            [$parameters[0], request()->input($parameters[0])], 
            $message
        );
    });

(необязательно) Создайте сообщение об ошибке в resources/lang/en/validation.php:

'empty_if' => 'The :attribute field must be empty when :other is :value.',

Затем используйте это правило в контроллере (с require_if для соблюдения обоих правил исходного сообщения):

$attributes = request()->validate([
    'a' => 'required',
    'b' => 'required_if:a,x|empty_if:a,y,z'
]);

Оно работает!

Примечание: возможно, я создам для этого пакет с empty_if и empty_unless и размещу ссылку здесь

person rap-2-h    schedule 24.01.2018

Обязательно, если

required_if:anotherfield,value,... Проверяемое поле должно присутствовать и не быть пустым, если поле otherfield равно любому значению.

'b' => 'required_if:a,x'
person Levente Otta    schedule 24.01.2018
comment
Спасибо, но если я не ошибаюсь, оно охватывает только первое правило: если a == x, b должно иметь значение. Но оно не распространяется на второе правило: если a != x, b должно быть пустым. - person rap-2-h; 24.01.2018
comment
@ rap-2-h вам нужно создать для этого собственное правило. - person Alexey Mezenin; 24.01.2018
comment
@AlexeyMezenin Хорошо, если хотите, можете опубликовать это как ответ. В противном случае я опубликую свой собственный. Так что как хотите! :) - person rap-2-h; 24.01.2018
comment
@rap-2-h, опубликуйте пожалуйста. ) - person Alexey Mezenin; 24.01.2018

Я знаю, что слишком поздно для ответа, но для тех, кто придет к этому позже, у Laravel есть собственный метод запроса поля, когда присутствует другое поле. Метод называется required_with, и вы можете найти больше о нем здесь.

person Ebi    schedule 26.10.2020
comment
автор вопроса упомянул, я пробовал required_with, required_without, но, похоже, это не может покрыть мой случай. тогда почему ты предлагаешь то же самое - person bhucho; 26.10.2020