Как проверить массив в Laravel?

Я пытаюсь проверить массив POST в Laravel:

$validator = Validator::make($request->all(), [
            "name.*" => 'required|distinct|min:3',
            "amount.*" => 'required|integer|min:1',
            "description.*" => "required|string"

        ]);

Я посылаю пустой POST и получаю этот if ($validator->fails()) {} как False. Это означает, что проверка правильна, но это не так.

Как проверить массив в Laravel? Когда я отправлю форму с помощью input name="name[]"

Ответ 1

Символ звездочки (*) означает, что вы хотите проверить VALUES в массиве, а не в самом массиве.

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

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

  • "Имя" должно быть массивом не менее 3-х элементов.
  • Значения в массиве "name" должны быть разными (уникальными) строками длиной не менее 3 символов.

РЕДАКТИРОВАТЬ: Начиная с Laravel 5.5 вы можете вызывать метод validate() непосредственно для объекта Request, например так:

$data = $request->validate([
    "name"    => "required|array|min:3",
    "name.*"  => "required|string|distinct|min:3",
]);

Ответ 2

У меня есть этот массив в качестве данных моего запроса из таблицы/таблицы данных HTML + Vue.js:

[0] => Array
    (
        [item_id] => 1
        [item_no] => 3123
        [size] => 3e
    )
[1] => Array
    (
        [item_id] => 2
        [item_no] => 7688
        [size] => 5b
    )

И используйте это для проверки правильности работы:

$this->validate($request, [
    '*.item_id' => 'required|integer',
    '*.item_no' => 'required|integer',
    '*.size'    => 'required|max:191',
]);

Ответ 3

Рекомендуемый способ написания логики проверки и авторизации - поместить эту логику в отдельные классы запросов. Таким образом, код вашего контроллера останется чистым.

вы можете создать класс запроса, выполнив php artisan make:request SomeRequest

в методе Request class rules() определите ваши правила проверки

//SomeRequest.php
public function rules()
{
   return [
    "name"    =>[
          'required',
          'array', //input must be an array
          'min:3'//there must be three members in the array
     ],
    "name.*"  => [
          'required',
          'string',//input must be of type string
          'distinct',//members of the array must be unique
          'min:3'//each string must have min 3 chars
     ]
  ];
}

в своем контроллере напишите свою функцию маршрута следующим образом

public function someFunction(SomeRequest $request) 
{
  //request is already validated before reaching this point
  //your controller logic goes here
}

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

Вы можете создать классы родительского запроса для запросов аналогичного типа, например, для запросов web и api, а затем инкапсулировать некоторую общую логику запросов в эти родительские классы.

Ответ 4

Вам нужно перебрать входной массив и добавить правила для каждого входа, как описано здесь: Loop Over Rules

Вот некоторый код для ya:

$input = Request::all();
$rules = [];

foreach($input['name'] as $key => $val)
{
    $rules['name.'.$key] = 'required|distinct|min:3';
}

$rules['amount'] = 'required|integer|min:1';
$rules['description'] = 'required|string';

$validator = Validator::make($input, $rules);

//Now check validation:
if ($validator->fails()) 
{ 
  /* do something */ 
}

Ответ 5

Немного более сложные данные, сочетание @Laran и @Nisal Gunawardana ответов

[ 
   {  
       "foodItemsList":[
    {
       "id":7,
       "price":240,
       "quantity":1
                },
               { 
                "id":8,
                "quantity":1
               }],
        "price":340,
        "customer_id":1
   },
   {   
      "foodItemsList":[
    {
       "id":7,
       "quantity":1
    },
    { 
        "id":8,
        "quantity":1
    }],
    "customer_id":2
   }
]

Правило проверки будет

 return [
            '*.student_id' => 'required|numeric|exists:customers,id',
            '*.foodItemsList.*.id' => 'required|exists:food_items,id',
            '*.foodItemsList.*.quantity' => 'required|numeric',
        ];