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',
];
注意技巧就是使用带点符号的通配符 (*
) 来表示数组项本身的索引值。
我有提交多维数组的表单。 喜欢:
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',
];
注意技巧就是使用带点符号的通配符 (*
) 来表示数组项本身的索引值。