如何在Laravel中验证数组?

Dar*_*ama 82 php laravel laravel-5.4

我尝试在Laravel中验证数组POST:

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

        ]);
Run Code Online (Sandbox Code Playgroud)

我发送空POST并将其if ($validator->fails()) {}作为False.这意味着验证是正确的,但事实并非如此.

如何在Laravel中验证数组?当我提交表格时input name="name[]"

Fil*_*bol 180

星号(*)表示您要检查数组中的VALUES,而不是实际的数组.

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

在上面的例子中:

  • "名称"必须是包含至少3个元素的数组.
  • "name"数组中的值必须是不同的(唯一)字符串,长度至少为3个字符.

编辑:从Laravel 5.5开始,您可以直接在Request对象上调用validate()方法,如下所示:

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

  • 谢谢,它帮助我在laravel 5.5以及...... :-) (2认同)
  • 不需要“name.*”上的必需内容,因为它仅验证它是否存在 (2认同)

Nis*_*ana 23

我有这个数组作为我的HTML + Vue.js数据网格/表中的请求数据:

[0] => Array
    (
        [item_id] => 1
        [item_no] => 3123
        [size] => 3e
    )
[1] => Array
    (
        [item_id] => 2
        [item_no] => 7688
        [size] => 5b
    )
Run Code Online (Sandbox Code Playgroud)

并使用它来验证哪些工作正常:

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


Pra*_*ahu 12

稍微复杂一点的数据,@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
   }
]
Run Code Online (Sandbox Code Playgroud)

验证规则将是

 return [
            '*.customer_id' => 'required|numeric|exists:customers,id',
            '*.foodItemsList.*.id' => 'required|exists:food_items,id',
            '*.foodItemsList.*.quantity' => 'required|numeric',
        ];
Run Code Online (Sandbox Code Playgroud)


sum*_*mit 6

编写验证和授权逻辑的推荐方法是将该逻辑放在单独的请求类中。这样,您的控制器代码将保持干净。

您可以通过执行创建请求类 php artisan make:request SomeRequest

在Request类的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
     ]
  ];
}
Run Code Online (Sandbox Code Playgroud)

在您的控制器中编写如下的路由功能

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

请求类带有验证前后的钩子/方法,可以根据业务逻辑和特殊情况自定义钩子/方法,以修改请求类的正常行为。

您可以为类似类型的请求(例如Web和api请求)创建父请求类,然后​​将一些通用请求逻辑封装在这些父类中。