Laravel 验证器与通配符

8

我希望创建一个 Laravel 验证器,用于验证嵌套在数组中的未命名数组(0、1、2、3)中的字段。

因此,我的数组如下:

array [ //the form data
  "items" => array:2 [ //the main array i want to validate
    0 => array:2 [ // the inner array that i want to validate its data
      "id" => "1"
      "quantity" => "1000"
     ]
    1 => array:2 [
     "id" => "1"
     "quantity" => "1000"
     ]
  // other fields of the form,
  ]

]

so what i want is something like

  $validator = Validator::make($request->all(), [
     'items.*.id' => 'required' //notice the star *
  ]);
2个回答

7

Laravel 5.2

现在支持问题中的语法。

http://laravel.com/docs/master/validation#validating-arrays

Laravel 5.1

首先使用所有其他规则创建验证器。对于数组项,请使用array规则。

$validator = Validator::make($request->all(), [
    'items' => 'array',
    // your other rules here
]);

然后使用验证器的each方法,对items数组中的每个项目应用一组规则。

$validator->each('items', [
    'id'       => 'required',
    'quantity' => 'min:0', 
]);

这将自动为您设置这些规则...


items.*.id       => required
items.*.quantity => min:0

https://github.com/laravel/framework/blob/5.1/src/Illuminate/Validation/Validator.php#L261


1
太好了!不知道这个。一定要包含在文档中! - shock_gone_wild
1
看起来新的 Laravel(5.2)加入了我的建议 :D - AlhasanIQ
@AlhasanIQ 是的,能够在一个地方设置所有规则真是太好了。我会更新我的答案。 - andrewtweber
有没有想法如何为那些 . 规则指定自定义消息? - James
@James,应该与常规消息相同:'items.*.id.required' => '需要项目ID'。我不认为有任何内置的方法可以在消息中引用 * 键,如果这是你的意思。 - andrewtweber

0
您可以简单地做如下操作:

    $rules = [];
    for($i = 0; $i < 10; $i++) {
        $rules["items.$i.id"] = "required";
    }
    $validator = \Validator::make($request->all(), $rules);

这个可以工作,但是 Laravel 已经有了一个 each 方法来完成同样的事情,所以为什么要重新发明轮子呢? - andrewtweber
确定吗?http://laravel.com/docs/5.1/validation#available-validation-rules 我在文档中找不到它。 - shock_gone_wild
不是所有东西都有文档记录。它们在源代码中,参见我的回答中的链接。 - andrewtweber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接