Я пытаюсь сделать некоторые проверки в Laravel.У меня есть ресурс с вложенными ресурсами, поэтому мне нужно проверить много вещей одновременно.У меня есть Level
, который состоит из многих Questions
.Поэтому, чтобы проверить их, я сначала проверяю Level
, а затем каждый вопрос один за другим.
Я использую следующий метод:
public function ValidateDataAgainstModel($data) {
$book = Level::ValidationBook(); // Or Answer::ValidationBook()
$validator = Validator::make($data,
$book['rules'],
$book['messages']);
if ($validator->fails()) {
return $validator->errors();
}
return null;
}
Этот метод используется на уровнеи вопрос, так это то же самое.Затем я группирую все ошибки в одном массиве, например:
$errors = [];
$errors['level'] = $levelError;
$errors['questions'] = $questionsErrors; //$questionErrors is an array of each question errors
Затем, чтобы проверить правильность моего массива, я создаю \Log::info($errors)
и получаю следующий результат:
[2018-12-12 23:47:12] local.INFO: array (
'level' =>
Illuminate\Support\MessageBag::__set_state(array(
'messages' =>
array (
'name' =>
array (
0 => 'Se requiere el nombre del nivel',
),
),
'format' => ':message',
)),
'questions' =>
array (
0 =>
Illuminate\Support\MessageBag::__set_state(array(
'messages' =>
array (
'description' =>
array (
0 => 'Se requiere la descripción de la pregunta',
),
),
'format' => ':message',
)),
1 =>
Illuminate\Support\MessageBag::__set_state(array(
'messages' =>
array (
'description' =>
array (
0 => 'Se requiere la descripción de la pregunta',
),
),
'format' => ':message',
)),
),
)
Как видите, у меня два вопроса с ошибками.Чтобы вернуть это моему клиенту, когда я делаю следующее
if ( count($errors) > 0 ) {
throw ValidationException::withMessages($errors);
}
Но когда данные поступают на мой клиент, ошибки вопроса не завершены.Вместо того, чтобы получить индекс с массивом ошибок вопросов, я получил только одну ошибку вопроса.
![This is the console.log of the errors](https://i.stack.imgur.com/2Afzd.png)
Кто-нибудь знает, почему это происходит?Похоже, группирует ошибки в одну.
Наконец, я добавляю весь метод, который вычисляет результат:
public function Create($data) {
// Create array to handle all the nested resources
$errors = [];
// Validate that the data array is correct
$levelErrors = $this->ValidateDataAgainstModel($data);
if ( !is_null($levelErrors) ) {
$errors['level'] = $levelErrors;
}
$questionsErrors = [];
foreach($data['questions'] as $questionData) {
/*
* We remove the level_id because we are validating the
* question content
*/
$validationBook = Question::ValidationBook();
unset($validationBook['rules']['level_id']);
$questionErrors = QuestionService::ValidateDataAgainstModel($questionData, $validationBook);
if ( !is_null($questionErrors) ) {
$questionsErrors[$questionData['index']] = $questionErrors;
}
}
if ( count($questionsErrors) > 0 ) {
$errors['questions'] = $questionsErrors;
}
if ( count($errors) > 0 ) {
\Log::info($errors);
throw ValidationException::withMessages($errors);
}
// Create the object
$result = Level::create($data);
return $result;
}
Я не знаю, если проблемареализацию метода withErrors
, которую вы можете увидеть здесь Исходный код ValidationException