9

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

$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 方法验证“title”键?

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

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

我完全被索引数组弄糊涂了。任何帮助都会很棒。

4

3 回答 3

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

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

这将允许您创建自己的规则,您可以在其中期望一个数组值并根据需要对其进行迭代。

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

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

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

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

于 2013-07-31T20:39:02.097 回答
2

正如@Cryode 所说,Laravel 目前不提供开箱即用的功能。我创建了一个扩展默认 Laravel Validator 的类来添加一个iterate($attribute, $rules, $messages)方法。

它还可以递归地遍历数组,以便(例如)如果您有任意数量的“书籍”,每本可能有任意数量的“引用”,这仍然有效,@Cryode 的示例没有这样做,所以这个更健壮一点。

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

于 2014-09-12T17:28:31.367 回答
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);
于 2017-07-19T14:10:23.463 回答