首页 > 解决方案 > Laravel 6 API请求在保存之前验证对象数组

问题描述

问题:如何正确验证通过 API 请求发送的 JSON 对象数组?

情况

我发送了一个要保存的 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);
});

在这一个中,验证被忽略。

标签: phpjsonlaravel-routinglaravel-6

解决方案


$this->validate()控制器方法不同,Validator::make()如果验证失败,静态函数不会抛出错误。

您将需要检查它是否失败并使用->fails()Validator 方法返回错误消息:

$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,因此您需要相应地更改代码。


推荐阅读