2013-07-31 92 views
9

我对各种事物的数组...Laravel 4验证 - 嵌套索引数组?

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

我怎么会验证“标题”键,使用验证方法Laravel 4?

这里是我迄今为止...

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

我由索引数组完全狼狈。任何帮助都会很棒。

+0

林奄奄一息看到这个答案:)我一直是doi通过执行foreach,然后将结果存储在另一个数组中,然后检查该数组是否存在错误,并显示 – KyleK

回答

19

以下的答案为Laravel < = 5.1。 Laravel 5.2引入built-in array validation


此时,确认类不意味着迭代阵列数据。虽然它可以遍历嵌套数组以查找特定值,但它期望该值为单个值(通常为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:扩展验证类和替换/母体中的规则问题接受阵列。

创建您自己的扩展验证程序类,并实现自定义规则或重命名现有规则,从而使这些规则在出现问题时接受数组值。这对#2自定义规则选项有一些类似的警告,但如果您打算经常验证迭代数组,则可能是“最佳做法”。

+0

感谢您提供一个非常简洁的答案。我有一种感觉,一种解决方案不可用,但是你的第一种方法将工作得很好。干杯! –

+0

@Cryode,如果我有嵌套参数,我可以以与case1相同的方式执行它,我不必创建新规则,我只需要一种方法来验证表单项。 – user269867

2

正如@Cryode说,Laravel目前不提供此功能的开箱。我创建了一个扩展默认Laravel Validator的类来添加iterate($attribute, $rules, $messages)方法。(例如)如果你有任何数量的“书籍”,其中每一个都可能有任何数量的“引用”,这仍然可以工作,而@ Cryode的例子并不是这样这样做,所以这是一个更强大一点。

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

+0

这是使用Laravel 5测试过的吗? – robjbrain

+0

没有。不过,我实际上已经提交了一个pull请求,将它合并到4中。测试全部通过,但目前处于陷阱状态。 – patricksayshi

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