Запрос API Laravel 6 проверяет массив объектов перед сохранением - PullRequest
0 голосов
/ 03 октября 2019

Проблема : Как правильно проверить массив объектов JSON, отправленных с помощью запроса API?

Ситуация :

Я отправилопубликовать запрос массива 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);
});

Iтакже пытался пройтись по каждому из них для проверки, к сожалению, это не работает.

Попытка # 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);
});

В этом случае проверка игнорируется.

Ответы [ 2 ]

1 голос
/ 03 октября 2019

В отличие от метода контроллера $this->validate(), статическая функция Validator::make() не выдаст ошибку, если проверка не удалась.

Вам нужно будет проверить, не произошла ли ошибка, и вернуть сообщения об ошибках, используя ->fails() Метод валидатора:

$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, поэтому вам нужно будет соответствующим образом изменить код.

0 голосов
/ 03 октября 2019
$answer = [ 'answer' => $requests->all() ];


$validator = Validator::make($answer, [
       'answer.*.title' => 'required|string',
       'answer.*.question_id' => 'required|integer'
    ]);
...