我正在尝试在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);
}
但是,当数据到达我的客户端时,问题错误并不完整。我没有得到带有一系列问题错误的索引,而是仅遇到一个问题错误。
有人知道为什么会这样吗?似乎将错误归为一个错误。
最后,我将添加计算结果的整个方法:
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;
}
我不知道问题是否出在ValidationException Source Code
上。