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

Cap*_*ack 9 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'];
Run Code Online (Sandbox Code Playgroud)

如何使用Laravel 4中的Validator方法验证'title'键?

这是我到目前为止所拥有的......

$validator = Validator::make($foo, ['stuff.item.???.title' => 'required']);
Run Code Online (Sandbox Code Playgroud)

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

Ake*_*rts 19

以下答案适用于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());
Run Code Online (Sandbox Code Playgroud)

2:创建自定义验证方法.

这将允许您创建自己的规则,您可以期望数组值并根据需要迭代它.

这个方法有一些注意事项,A)你不会有特定的值错误消息,因为它会对整个数组产生错误(例如,如果你stuff.item作为要检查的值传递),并且B)你需要在自定义函数中检查所有数组的可能值(我假设您不仅仅title需要验证).

您可以使用Validator::extend()或通过在其他位置完全扩展类来创建验证方法.

3:扩展Validator类并替换/ parent有问题的规则以接受数组.

创建自己的扩展Validator类,并实现自定义规则或重命名现有规则,使这些规则能够接受数组值(如果有的话).这与#2自定义规则选项有一些类似的警告,但如果您打算经常验证迭代数组,则可能是"最佳实践".