以下答案适用于 Laravel <= 5.1。Laravel 5.2 引入了内置数组验证。
目前,Validator 类并不意味着迭代数组数据。虽然它可以遍历嵌套数组以查找特定值,但它希望该值是单个(通常是string
)值。
在我看来,你有几个选择:
1:使用字段名称中的数组键创建规则。
['stuff']['item']
基本上基本上你已经在做,除了你需要弄清楚你的数组有多少值。我做了这样的事情,效果很好:
$data = [
'stuff' => [
'item' => [
['title' => 'flying_lotus'],
['title' => 'various_cheeses'],
['title' => ''],
['title' => 'welsh_cats'],
]
]
];
$rules = [];
for ($i = 0, $c = count($data['stuff']['item']); $i < $c; $i++)
{
$rules["stuff.item.{$i}.title"] = 'required';
}
$v = Validator::make($data, $rules);
var_dump($v->passes());
2:创建自定义验证方法。
这将允许您创建自己的规则,您可以在其中期望一个数组值并根据需要对其进行迭代。
此方法有其注意事项,因为 A)您不会有特定的值错误消息,因为它会为整个数组出错(例如,如果您stuff.item
作为要检查的值传递),并且 B)您需要在您的自定义函数中检查您数组的所有可能值(我假设您将拥有的不仅仅是title
验证)。
您可以通过使用Validator::extend()
或在其他地方完全扩展类来创建验证方法。
3:扩展 Validator 类并替换/父有问题的规则以接受数组。
创建您自己的扩展 Validator 类,并实现自定义规则或重命名现有规则,使这些规则能够在发生时接受数组值。这与 #2 自定义规则选项有一些类似的警告,但如果您打算经常验证迭代数组,这可能是“最佳实践”。