2017-02-21 78 views
0

我正在尝试做输入数组验证。现在我得到了这个:Laravel 5输入验证名称正则表达式

$rules = [ 
    'name' => 'required|array', 
]; 

if(array_key_exists('name', $data) && is_array($data['name'])) { 
    foreach ($data['name'] as $key => $value) { 
    $rules['name.' . $key] = 'required|nullable|string|max:255'; 
    } 
} 

$v = Validator::make($data, $rules); 

此代码的作品,但我想确保密钥也是正确的。我可以简单地在foreach循环内添加更多检查,但这会使验证器本身无用,因为手动检查所有内容会更简单。

完美,我要实现的是这样的:由Validator或可能通过它的一些扩展

$v = Validator::make($data, [ 
    'name' => 'required|array', 
    'name.[a-z]{2}' => 'required|nullable|string|max:255' 
]); 

这可能吗?

回答

1

当然,你可能只写name.*

$v = Validator::make($data, [ 
    'name' => 'required|array', 
    'name.*' => 'required|nullable|string|max:255' 
]); 

这里有Laravel Validating Arrays Docs

+0

谢谢,看来我在阅读文档时错过了这篇文章。但是,这仍然不包括我需要验证数组密钥的情况。 –

2

你可以这样做:

在你AppServiceProvider.php扩展您的验证,包括这条规则:

Validator::extend('customrule', function ($attribute, $value, $parameters, $validator) { 
     return is_array($value) && !empty(array_filter($value, function ($v) { return preg_match("/^[a-z]{2}$/",$v); }); 
}); 

然后在你的代码:

$rules = [ 
    'name' => 'required|array', 
    'name.*' => 'required|nullable|string|max:255' 
]; 
$extraRules = [ 
    'namekeys' => 'customrule' 
]; 

$v = Validator::make($data, $rules); 
if ($v->valid()) { 
    $v2 = Validator::make(["namekeys" => array_keys($data["name"]) ], $extraRules); 
} 

也许我只是过分复杂的事情。

+0

感谢您的解决方案,我会继续寻找更简单的解决方案,但是这个解决方案比我的解决方案简单得多。 –