我的Laravel 5.5 API上有一个POST端点,我使用邮递员测试我的路线,这就是问题所在。 我想发送一个相同类型的对象数组,如下所示:
[
{
"name":"test",
"tag":"TEST"
},
{
"name":"test2",
"tag":"TEST_2"
}
]
但我无法正确验证它。
在我的控制器中,我有这个:
$validator = Validator::make($requests->all(), [
'name' => 'required|string',
'tag' => 'required|string'
]);
if($validator->fails())
//Warn user for errors
我也尝试过简单的
$this->validate($requests->all() .... )
我尝试使用'.name'
和'*.name'
重命名规则,但没有成功。
我尝试用$request->all()
替换$request->input()
但没有成功。
我也尝试过循环但是我得到了异常
foreach($request as $req){
$validator = Validator::make($req ....)
//rest of the code
}
另一方面,我可以像$datas = $request->all()
一样检索数据并存储它们,但没有验证。
似乎唯一有效的解决方案是命名我的数组:
{
"data" : [
{
"name":"test",
"tag":"TEST"
},
{
"name":"test2",
"tag":"TEST_2"
}
]
}
然后使用'data.*.name'
命名规则,但这需要API用户解析数组。
假设我有一个数组$array
我要存储,我需要做
$arrayParsed = ['data' => $array]
并使用$arrayParsed
调用API,我认为这有点多余。
有没有更好的方法来解决这个问题?
答案 0 :(得分:9)
您可以先尝试解决问题:
$data = [ 'data' => $requests->all() ];
然后你可以使用你建议的规则:
$validator = Validator::make($data, [
'data.*.name' => 'required|string',
'data.*.' => 'required|string'
]);
不是最优雅的解决方案,但它解决了您的问题......
答案 1 :(得分:3)
我能够在laravel 6中通过App \ Http \ Requests CustomRequestClass进行以下操作
public function rules()
{
return [
'*.name' => 'required',
'*.tag' => 'required'
];
}
答案 2 :(得分:0)
如果您发布一个数组,则可以使用批准的答案,但是,要进一步进行操作,我需要保存多个数组。如果我创建两个端点,则该方法可行,但如果要将所有内容保存在一个DB::transaction
中怎么办?
中提琴:
POST:
{
"array1": [
{ "key1": "string", "key2": 1 },
{ "key1": "string", key2": 0 }
],
"array2": [
{ "key3": "string", "key4": 1 },
{ "key3": "string", "key4": 0 }
]
}
服务器:
$this->validate($request, [
'array1' => 'present|array',
'array2' => 'present|array',
'array1.*.key1' => 'required|string',
'array1.*.key2' => 'required|integer',
'array2.*.key3' => 'required|string',
'array2.*.key4' => 'required|integer'
]);
DB::transaction(function() use($request) {
foreach($request['array1'] as $x){
...do stuff here
};
});
注意:'present|array'
接受空数组,而'required|array'
拒绝它们。