我正在使用 Laravel 5.6 并为我的表单设置了表单请求验证,该表单提交单行,对其进行验证,然后添加到数据库中。这一切都很好。
对于多行的批量导入,我有一个 CSV 导入。CSV 被解析为一个数组,数组的每一行都包含与我的表单中提供的完全相同类型的数据。因此它可以使用相同的验证规则。
我有点迷失如何实际实现这一点;从 CSV 解析的数据在一个数组中,而不是表单验证请求正在寻找的请求对象。
有没有人有关于能够在不重复代码的情况下对表单和 CSV 使用我的表单验证的最佳方式的任何提示?
编辑
如果有人感兴趣,我的最终解决方案是不使用表单请求验证。在我的例子中,将验证规则和消息添加到控制器内的一些受保护函数中更容易。这意味着它们可以在需要它的每个控制器功能(存储、csvStore 等)中重复使用,而无需重复代码。在这种情况下,我不确定表单请求验证功能有什么优势。
//reformat CSV into array
$master = [];
$line_id = 1;
foreach ($data as $row) {
//skip blank rows
if (empty($row['sku'])) continue;
//build master
foreach($row as $key => $value){
if(!empty($value)) $master[$row['sku']][$key] = $row[$key];
}
//add line number for debugging
$master[$row['sku']]['line_number'] = $line_id;
$line_id++;
}
//Validate each row of CSV individually
$error_messages = new MessageBag();
$error_count = 0;
$duplicate_count = 0;
if(empty($master)){
//empty $master
$error_messages->add('', 'CSV file does not contain valid data or is empty');
flash()->message('Nothing was imported');
return redirect()->back()->withErrors($error_messages);
} else {
foreach($master as $row){
$validator = Validator::make($row,$this->createValidationRules(), $this->createValidationMessages());
//Check validation
if ($validator->fails()){
$master[$row['sku']]['valid'] = false;
if(isset($validator->failed()['sku']['Unique'])){
$duplicate_count ++;
if(!request('ignore-duplicates') && !request('ignore-errors')) $error_messages->merge($validator->errors()->messages()); //save error messages
} else {
$error_count ++;
if(!request('ignore-errors')) $error_messages->merge($validator->errors()->messages()); //save error messages
}
} else {
$master[$row['sku']]['valid'] = true;
}
}
}
//add successful rows to DB
$success_count = 0;
foreach($master as $row){
if($row['valid'] == true){
$productCreate = new ProductCreate();
$productCreate->create($row);
$success_count++;
}
}
然后,我使用成功/错误/重复计数来发回合适的错误消息包和/或闪存消息。