Як перевірити масив у Laravel?


105

Я намагаюся перевірити масив 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[]"

Відповіді:


239

Зірочка (*) використовується для перевірки значень у масиві, а не самого масиву.

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

У наведеному вище прикладі:

  • "names" має бути масивом щонайменше з 3 елементами,
  • значення в масиві "імена" мають бути різними (унікальними) рядками, довжиною не менше 3 символів.

РЕДАКТУВАТИ: Оскільки Laravel 5.5 ви можете викликати метод validate () безпосередньо в об'єкті Запит так:

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

не забудьте помістити його в спробу лову, якщо ви використовуєте $request->validate([...]). Буде застосовано виняток, якщо дані не проходять перевірку.
daisura99

як отримати повідомлення про помилку конкретного поля? як у мене є 2 поля імені, і тоді це друге поле, яке має лише помилку, як я можу це досягти?
Eem Jee,

38

У мене є цей масив як дані мого запиту з сітки / таблиці даних 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',
]);

2
Це саме той тип речей, який мені потрібен!
Кріс

17

Рекомендований спосіб написання логіки перевірки та авторизації - це розміщення цієї логіки в окремих класах запитів. Таким чином ваш код контролера залишатиметься чистим.

Ви можете створити клас запиту, виконавши php artisan make:request SomeRequest.

У 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
    ]
  ];
}

У своєму контролері напишіть свою функцію маршруту так:

// SomeController.php
public function store(SomeRequest $request) 
{
  // Request is already validated before reaching this point.
  // Your controller logic goes here.
}

public function update(SomeRequest $request)
{
  // It isn't uncommon for the same validation to be required
  // in multiple places in the same controller. A request class
  // can be beneficial in this way.
}

Кожен клас запиту постачається із зачепками / методами до та після перевірки, які можна налаштувати на основі ділової логіки та особливих випадків, щоб змінити нормальну поведінку класу запитів.

Ви можете створити батьківські класи запитів для подібних типів запитів (наприклад, webі api) запитів, а потім інкапсулювати загальну логіку запитів у цих батьківських класах.


6

Трохи складніші дані, поєднання відповідей @ 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 [
            '*.customer_id' => 'required|numeric|exists:customers,id',
            '*.foodItemsList.*.id' => 'required|exists:food_items,id',
            '*.foodItemsList.*.quantity' => 'required|numeric',
        ];

4

Вам потрібно прокрутити масив вводу та додати правила для кожного вводу, як описано тут: Правила петлі

Ось декілька кодів для вас:

$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 */ 
}

9
Не потрібно цього робити - laravel.com/docs/5.4/validation#validating-arrays
Філіп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.