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 中获得一系列答案,因此您需要相应地更改代码。