我有各种各样的东西......
$foo = [];
$foo['stuff']['item'][0]['title' => 'flying_lotus'];
$foo['stuff']['item'][1]['title' => 'various_cheeses'];
$foo['stuff']['item'][2]['title' => 'the_career_of_vanilla_ice'];
$foo['stuff']['item'][3]['title' => 'welsh_cats'];
我如何验证'标题' key,使用Laravel 4中的Validator方法?
这是我到目前为止所拥有的......
$validator = Validator::make($foo, ['stuff.item.???.title' => 'required']);
我完全被索引数组搞砸了。任何帮助都会很棒。
答案 0 :(得分:19)
以下答案适用于Laravel< = 5.1。 Laravel 5.2引入了built-in array validation。
目前,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自定义规则选项有一些类似的注意事项,但如果您打算经常验证迭代数组,则可能是“最佳实践”。
答案 1 :(得分:2)
正如@Cryode所说,Laravel目前不提供此功能。我创建了一个扩展默认Laravel Validator的类来添加iterate($attribute, $rules, $messages)
方法。
它也可以通过数组递归迭代,以便(例如)如果你有任意数量的“书籍”,每个书都可以有任意数量的“引用”,这仍然有效,@ Cryode的例子不做,所以这更加强大。
答案 2 :(得分:0)
除了@Cryode回答,还有我的laravel 5问题。
我的表单有一个数据库ID索引。所以我的表单字段有索引
$foo['stuff']['item'][8]['title' => 'flying_lotus'];
$foo['stuff']['item'][12]['title' => 'various_cheeses'];
$foo['stuff']['item'][23]['title' => 'the_career_of_vanilla_ice'];
我用foreach来实现我的目标
foreach($request->input()['stuff']['items'] as $key => $value){
$rules["stuff.items.{$key}.title"] = 'required';
}
和自定义错误消息
foreach($request->input()['stuff']['items'] as $key => $value){
$messages["stuff.items.{$key}.title.required"] = 'Each Title is required...';
}
并验证
Validator::make($request->input(), $rules, $messages);