Laravel: ValidationException :: withMessages не отправляет все ошибки - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь сделать некоторые проверки в 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

Кто-нибудь знает, почему это происходит?Похоже, группирует ошибки в одну.

Наконец, я добавляю весь метод, который вычисляет результат:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...