【问题标题】:Laravel 6 API request validate array of objects before savingLaravel 6 API请求在保存之前验证对象数组
【发布时间】:2023-03-16 07:35:02
【问题描述】:

问题:如何正确验证通过 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);
});

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

【问题讨论】:

    标签: php json laravel-routing laravel-6


    【解决方案1】:

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

    【讨论】:

    • 当我使用 "$this->validate()" 您的第二个示例时,它返回类似 "message" 的错误:"Call to undefined method Illuminate\\Routing\\RouteFileRegistrar::validate()"
    • 你在哪里调用方法?在你的控制器中?
    • 在 routes/api.php 中。我没有使用控制器。我必须使用控制器来完成这项工作吗?
    • 这需要使用控制器,因为它是一种验证方法
    • 谢谢,我在 'answer.*.title' 中添加了 's' 并且成功了
    【解决方案2】:
    $answer = [ 'answer' => $requests->all() ];
    
    
    $validator = Validator::make($answer, [
           'answer.*.title' => 'required|string',
           'answer.*.question_id' => 'required|integer'
        ]);
    

    【讨论】:

    • 我试过这个验证,它通过了,但没有工作“
    猜你喜欢
    • 2020-08-08
    • 2016-08-10
    • 2020-07-13
    • 2016-06-04
    • 2017-10-01
    • 2021-02-15
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    相关资源
    最近更新 更多