Как использовать required_if для полей файлового массива с массивом для первого аргумента?

#php #laravel #laravel-validation

#php #laravel #laravel-проверка

Вопрос:

У меня есть с массивом image_file ( image_file[1] , image_file[2] ) . Они являются входными данными типа file . Эти изображения требуются, только если другой массив полей (proposition_type) определен на 2.

Например :

  • если proposition_type[1] == 2 , image_file[1] должно быть заполнено ;
  • if proposition_type[2] == 1 , image_file[2] не должен быть заполнен.

Я попытался использовать следующие правила :

 $rules = [
    (...)
    'image_file.*' => 'required_if:proposition_type.*,2|image',
];
  

Но возникает любая ошибка в полях image_file.

Более того, я использовал required валидатор на своем image_file.* и, опять же, ошибка не возникает.

Может быть, у кого-то есть решение для этого? Или, может быть, я делаю что-то не так? 🙂

Спасибо!

Комментарии:

1. Я думаю, вам нужно будет написать функцию для обработки этого. laravel.com/docs/5.6/validation#custom-validation-rules

2. Да! Спасибо, Майк 🙂

Ответ №1:

Если вы хотите создать более сложное условие для правила required_if, вы можете использовать метод Rule::RequiredIf . Этот метод принимает логическое значение или замыкание. При передаче замыкания замыкание должно возвращать true или false, чтобы указать, требуется ли поле для проверки. Что-то вроде этого может сработать для вас:

  Validator::make($request->all(), [
 'image_file[1]' => Rule::requiredIf(function () use ($request) {
     if($request->proposition_type[1] == 2)
        return true;
     else
        return false;
 }),
 'image_file[2]' => Rule::requiredIf(function () use ($request) {
     if($request->proposition_type[2] == 1)
        return false;
     else
        return true;
 }),
]);
  

Комментарии:

1. Дело в том, что я не знаю, сколько image_file отправляется, Поэтому мне приходится генерировать таблицу динамически и т. Д… Спасибо за ответ.

Ответ №2:

Итак, что я сделал, наконец, это сгенерировал (точнее, завершил) мой массив правил на лету, создав while и добавив запись массива для каждого изображения.

 $i = 1;
$total_images = count($image_array);
while ($i <= $image_array)
{
    $this->rules['image_file.'.$i] = 'nullable|required_if:proposition_type.'.$i.',2|image';
    $i  ;
}

  

Для этого, конечно, необходимо, чтобы ваша форма имела входные данные с image_file1 именами , image_file2 , … .

Надеюсь, это поможет другим!