Проверьте массив входов в форме в Laravel 5.7 - PullRequest
0 голосов
/ 19 сентября 2018

Моя форма имеет одно и то же поле ввода несколько раз.Мое поле формы выглядит следующим образом:

<input type='text' name='items[]'>
<input type='text' name='items[]'>
<input type='text' name='items[]'>

И запрос содержит ($ request ['items'):

array:1 [▼
  "items" => array:3 [▼
    0 => "item one"
    1 => "item two"
    2 => "item three"
  ]
]

Я хочу заполнить хотя бы один из пунктов.Моя текущая проверка в контроллере

    $validator = Validator::make($request->all(),[
        'items.*' => 'required|array|size:1'
    ]);

Это не работает.Я пытался с комбинацией размера, требуется, обнуляемый.Ничего не работает.

Ответы [ 6 ]

0 голосов
/ 20 сентября 2018

Зная, что вы используете последнюю версию Laravel, я действительно советую изучить функцию запроса формы .Таким образом, вы можете отделить проверку от вашего контроллера, сохраняя его намного чище.

В любом случае, как подсказал ответ выше меня, вам должно быть достаточно:

'items' => 'required|array'
0 голосов
/ 20 сентября 2018

На самом деле достаточно использовать:

$validator = Validator::make($request->all(),[
        'items' => 'required|array'
    ]);

Произведенные изменения:

  • использовать items вместо items.* - вы хотите установить правило общегоitems, если вы используете items.*, это означает, что вы применяете правило к каждому отправляемому элементу массива отдельно
  • Удалено size:1, потому что это означает, что вы хотите, чтобы отправлялся ровно один элемент (и вы хотите по крайней мере один),Вам это вообще не нужно, потому что у вас есть правило required.Вы можете прочитать документацию для требуемого правила и прочитать там, что пустой массив может привести к сбою правила required, так что это правило required для массива делает этот массив, по крайней мере, 1 элементом,так что вам не нужно min:1 или size:1 вообще
0 голосов
/ 19 сентября 2018

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

https://laravel.com/docs/5.7/validation#custom-validation-rules

Чтобы проверить, имеет ли массив все нулевые значения, проверьте его с помощью array_filter, который возвращает false, если все они нулевые.

Так что-то вроде ...

  $request->validate([

    'items' => [
      // $attribute = 'items', $value = items array, $fail = error message as string
       function($attribute, $value, $fail) {
         if (!array_filter($value)) {
           $fail($attribute.' is empty.');
         } 
       },
     ]
   ]);

Это установит сообщение об ошибке: 'items пусто.'

0 голосов
/ 19 сентября 2018

Вы должны попробовать это:

$validator = $request->validate([
    "items"    => "required|array|min:3",
    "items.*"  => "required|string|distinct|min:3",
]);
0 голосов
/ 19 сентября 2018

Вы можете проверить это следующим образом:

$validator = Validator::make($request->all(), [
    "items"    => "required|array|min:1",
    "items.*"  => "required|string|distinct|min:1",
]);

В приведенном выше примере:

  • «items» должен быть массивом как минимум с 1 элементом.
  • Значения в массиве "items" должны быть разными (уникальными) строками длиной не менее 1 символа.
0 голосов
/ 19 сентября 2018

Просто делайте это как обычно:

 $validator = Validator::make($request->all(),[
    'items' => 'required'
  ]);
...