Laravel 4验证 - 嵌套索引数组?

时间:2013-07-31 15:13:14

标签: php laravel

我有各种各样的东西......

$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']);

我完全被索引数组搞砸了。任何帮助都会很棒。

3 个答案:

答案 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的例子不做,所以这更加强大。

https://github.com/penoonan/laravel-iterable-validator

答案 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);