Laravel 5: 请求验证多维数组

Laravel 5: Request validate multidimensional array

我有提交多维数组的表单。 喜欢:

slide[1][title]
slide[2][title]

现在我使用请求 class 来定义我的规则。 我如何循环遍历此 class 中的所有数组项。 我试过了:

public function rules()
{
    return [
        'id' => 'required',
        'slide' => 'array|min:1',
        'slide.*.title' => 'required|max:255',
        'slide.*.description' => 'required|max:255',
    ];
}

但是没有用。

没有针对多维数组的预配置验证规则。最简单的方法是在控制器内部进行数组验证。

问题是当你使用多维数组存储单个值时,逻辑是错误的,你应该解决的是你的逻辑,而不是框架。

例如,我看到很多时间发送用户凭证,如 $var['login']['pass'] 和 $var['login']['username' ],它可以很容易地转换为 2 个不同的变量,这会更有意义。

如果您知道这些值应该是什么,并且您确信验证可以对所有不同的值通用,您可以创建一个自定义验证器(阅读您的 laravel 版本的验证文档)。

关于您的代码,我认为多维数组的声明方式与您的 html slide[]['title'] 中的声明方式相同。了解您如何将这些参数发送到后端将很有帮助,然后能够为您提供有关如何设置验证的线索。

Laravel 5.5 或更高版本

您可以使用 Validator 中可用的相同数组验证语法,因此问题中的代码现在有效:

public function rules()
{
    return [
        'id' => 'required',
        'slide' => 'array|min:1',
        'slide.*.title' => 'required|max:255',
        'slide.*.description' => 'required|max:255',
    ];

}

Laravel 5.4 或更老

Disclaimer: This solution was posted in the question by Alexej. Since answers shouldn't be shared in the question body and the OP seems to be inactive, I repost his answer as a community wiki for future readers:

我通过获取幻灯片数组并循环遍历它找到了解决方案。

public function rules()
{
    $rules = [
        'id' => 'required',
        'slide' => 'array|min:1',
    ];
    foreach($this->request->get('slide') as $key => $val){
        $rules['slide.'.$key.'.title'] = 'required|max:255';
        $rules['slide.'.$key.'.description'] = 'required|max:255';
    }
    return $rules;
}

现在有更好的方法可以做到这一点。我不确定支持此功能的 Laravel 的确切最低版本,但我是 运行 5.5,并且这种方法有效。

假设您有如下请求数据:

index:0
is_required:1
type:select
name:favorite color
title:What is your favorite color?
meta[0][key]:subtitle
meta[0][value]:If you have multiple favorites, pick your favorite-favorite.
meta[1][key]:default_value
meta[1][value]:Pink
options[0][index]:0
options[0][value]:Red
options[1][index]:3
options[1][value]:Pink
options[2][index]:1
options[2][value]:Blue
options[3][index]:2
options[3][value]:Green

您的验证规则可能如下所示:

return [
    'index' => 'required|integer|min:0',
    'is_required' => 'required|boolean',
    'type' => [
        'required',
        Rule::in($this->types_enum)
    ],
    'name' => 'required|string|max:64',
    'meta' => 'sometimes|array',
    'meta.*.key' => 'required|string|max:64',
    'meta.*.value' => 'required|string',
    'options' => 'sometimes|array',
    'options.*.index' => 'required|integer|min:0',
    'options.*.value' => 'required|string',
];

注意技巧就是使用带点符号的通配符 (*) 来表示数组项本身的索引值。