Laravel 6 API 请求在保存前验证对象数组
Laravel 6 API request validate array of objects before saving
问题:如何正确验证通过 API 请求发送的 JSON 对象数组?
情况:
我发送了一个 post 请求,要求保存一个包含 JSON 个对象的数组。但是,我无法进行验证。
JSON
{
"answers": [
{
"title": "hello World",
"question_id": "1"
},
{
"title": "hello World 2",
"question_id": "2"
}
]
}
尝试 #1
Route::post('answer/multiple', function (Request $request) {
$answers = $request->answers;
foreach ($answers as $answer) {
$answer->validate([
'title' => 'required',
'question_id' => 'required',
]);
$new_answer = new Answer();
$new_answer->title = $answer['title'];
$new_answer->question_id = $answer['question_id'];
$new_answer->save();
}
return response()->json($request);
});
我也试过遍历每一个来验证,遗憾的是它不起作用。
尝试#2
Route::post('answer/multiple', function (Request $request) {
$validator = Validator::make($request->all(), [
'answer.*.title' => 'required',
'answer.*.question_id' => 'required',
]);
$answers = $request->answers;
foreach ($answers as $answer) {
$new_answer = new Answer();
$new_answer->title = $answer['title'];
$new_answer->question_id = $answer['question_id'];
$new_answer->save();
}
return response()->json($request);
});
在这一个中,验证被忽略。
$answer = [ 'answer' => $requests->all() ];
$validator = Validator::make($answer, [
'answer.*.title' => 'required|string',
'answer.*.question_id' => 'required|integer'
]);
与 $this->validate()
控制器方法不同,Validator::make()
静态函数在验证失败时不会抛出错误。
您需要使用 ->fails()
验证器方法检查它是否失败并 return 错误消息:
$validator = Validator::make($request->all(), [
'answer.*.title' => 'required',
'answer.*.question_id' => 'required',
]);
if ($validator->fails()) {
return redirect('post/create')
->withErrors($validator)
->withInput();
}
foreach ($request->answers as $answer) {
$new_answer = new Answer();
$new_answer->title = $answer['title'];
$new_answer->question_id = $answer['question_id'];
$new_answer->save();
}
return response()->json($request);
或者,您可以使用 $this->validate()
方法:
$validatedData = $this->validate($request, [
'answer.*.title' => 'required',
'answer.*.question_id' => 'required',
]);
请注意,我们使用 $request
而不是 $request->all()
。
另请注意,使用此方法时,您将在 $validatedData
中获得一系列答案,因此您需要相应地更改代码。
问题:如何正确验证通过 API 请求发送的 JSON 对象数组?
情况:
我发送了一个 post 请求,要求保存一个包含 JSON 个对象的数组。但是,我无法进行验证。
JSON
{
"answers": [
{
"title": "hello World",
"question_id": "1"
},
{
"title": "hello World 2",
"question_id": "2"
}
]
}
尝试 #1
Route::post('answer/multiple', function (Request $request) {
$answers = $request->answers;
foreach ($answers as $answer) {
$answer->validate([
'title' => 'required',
'question_id' => 'required',
]);
$new_answer = new Answer();
$new_answer->title = $answer['title'];
$new_answer->question_id = $answer['question_id'];
$new_answer->save();
}
return response()->json($request);
});
我也试过遍历每一个来验证,遗憾的是它不起作用。
尝试#2
Route::post('answer/multiple', function (Request $request) {
$validator = Validator::make($request->all(), [
'answer.*.title' => 'required',
'answer.*.question_id' => 'required',
]);
$answers = $request->answers;
foreach ($answers as $answer) {
$new_answer = new Answer();
$new_answer->title = $answer['title'];
$new_answer->question_id = $answer['question_id'];
$new_answer->save();
}
return response()->json($request);
});
在这一个中,验证被忽略。
$answer = [ 'answer' => $requests->all() ];
$validator = Validator::make($answer, [
'answer.*.title' => 'required|string',
'answer.*.question_id' => 'required|integer'
]);
与 $this->validate()
控制器方法不同,Validator::make()
静态函数在验证失败时不会抛出错误。
您需要使用 ->fails()
验证器方法检查它是否失败并 return 错误消息:
$validator = Validator::make($request->all(), [
'answer.*.title' => 'required',
'answer.*.question_id' => 'required',
]);
if ($validator->fails()) {
return redirect('post/create')
->withErrors($validator)
->withInput();
}
foreach ($request->answers as $answer) {
$new_answer = new Answer();
$new_answer->title = $answer['title'];
$new_answer->question_id = $answer['question_id'];
$new_answer->save();
}
return response()->json($request);
或者,您可以使用 $this->validate()
方法:
$validatedData = $this->validate($request, [
'answer.*.title' => 'required',
'answer.*.question_id' => 'required',
]);
请注意,我们使用 $request
而不是 $request->all()
。
另请注意,使用此方法时,您将在 $validatedData
中获得一系列答案,因此您需要相应地更改代码。