Php 如何在Laravel excel中使用多页获取验证错误消息
我将按照文档中的示例来处理多张图纸的导入 我的控制器:Php 如何在Laravel excel中使用多页获取验证错误消息,php,laravel,maatwebsite-excel,Php,Laravel,Maatwebsite Excel,我将按照文档中的示例来处理多张图纸的导入 我的控制器: public function import(Request $request) { $file = $request->file('import')->store('/storage'); $import = new MultisheetContactsImport(); $import->import($file);
public function import(Request $request) {
$file = $request->file('import')->store('/storage');
$import = new MultisheetContactsImport();
$import->import($file);
if ($import->failures()->isNotEmpty()) {
return $import->failures();
}
return $import->getRowCount();
}
我的导入类ContactsImport.php
namespace App\Imports;
use App\Models\Email;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\withHeadingRow;
use Maatwebsite\Excel\Concerns\SkipsOnError;
use Maatwebsite\Excel\Concerns\SkipsErrors;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\WithValidation;
use Maatwebsite\Excel\Concerns\SkipsOnFailure;
use Maatwebsite\Excel\Concerns\SkipsFailures;
use Illuminate\Support\Str;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Illuminate\Support\Facades\Validator;
use Throwable;
class ContactsImport implements ToModel, withHeadingRow, SkipsOnError, WithValidation, SkipsOnFailure
{
private $rows = 0;
use Importable, SkipsErrors, SkipsFailures;
/**
* @param array $row
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
++$this->rows;
return new Email([
'apiKey' => Str::random(16),
'firstname' => $row['firstname'],
'lastname' => $row['lastname'],
'emailAddress' => $row['emailaddress'],
'businessType' => $row['businesstype'],
'allowed' => true,
'updates' => true,
'marketing' => true,
]);
}
public function getRowCount(): int
{
return $this->rows;
}
public function rules(): array
{
return [
'*.emailaddress' => ['email', 'unique:emails,emailaddress']
];
}
}
class MultisheetContactsImport extends ContactsImport implements WithMultipleSheets
{
public function sheets(): array
{
return [
'Contacts' => new ContactsImport()
];
}
}
我的多页导入类MultisheetContactsImport.php
namespace App\Imports;
use App\Models\Email;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\withHeadingRow;
use Maatwebsite\Excel\Concerns\SkipsOnError;
use Maatwebsite\Excel\Concerns\SkipsErrors;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\WithValidation;
use Maatwebsite\Excel\Concerns\SkipsOnFailure;
use Maatwebsite\Excel\Concerns\SkipsFailures;
use Illuminate\Support\Str;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Illuminate\Support\Facades\Validator;
use Throwable;
class ContactsImport implements ToModel, withHeadingRow, SkipsOnError, WithValidation, SkipsOnFailure
{
private $rows = 0;
use Importable, SkipsErrors, SkipsFailures;
/**
* @param array $row
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
++$this->rows;
return new Email([
'apiKey' => Str::random(16),
'firstname' => $row['firstname'],
'lastname' => $row['lastname'],
'emailAddress' => $row['emailaddress'],
'businessType' => $row['businesstype'],
'allowed' => true,
'updates' => true,
'marketing' => true,
]);
}
public function getRowCount(): int
{
return $this->rows;
}
public function rules(): array
{
return [
'*.emailaddress' => ['email', 'unique:emails,emailaddress']
];
}
}
class MultisheetContactsImport extends ContactsImport implements WithMultipleSheets
{
public function sheets(): array
{
return [
'Contacts' => new ContactsImport()
];
}
}
如果我使用ContactsImport类而不使用多页,则failures和getRowCount方法可以很好地工作,但是现在我只得到一个响应0只需使用try-catch块包装导入行代码,它应该可以处理所有事情:
try {
$master = Excel::import(new MasterImport($auth), $request->file('master_upload'));
} catch (\Maatwebsite\Excel\Validators\ValidationException $e) {
$failures = $e->failures();
dd($failures);
foreach ($failures as $failure) {
$failure->row(); // row that went wrong
$failure->attribute(); // either heading key (if using heading row concern) or column index
$failure->errors(); // Actual error messages from Laravel validator
$failure->values(); // The values of the row that has failed.
}
}
您可以在ImportClass上添加此方法
/**
* @param Failure ...$failures
* @throws ValidationException
*/
public function onFailure(Failure ...$failures)
{
$exception = ValidationException::withMessages(collect($failures)->map->toArray()->all());
throw $exception;
}
用户Laravel验证验证
use Illuminate\Validation\ValidationException;
而不是在视图上显示验证消息:
@if(count($errors->getMessages()) > 0)
<div class="alert alert-danger alert-dismissible" role="alert">
<strong>Validation Errors:</strong>
<ul>
@foreach($errors->getMessages() as $errorMessages)
@foreach($errorMessages as $errorMessage)
<li>
{{ $errorMessage }}
<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
</li>
@endforeach
@endforeach
</ul>
</div>@endif
@if(计数($errors->getMessages())>0)
验证错误:
@foreach($errors->getMessages()作为$errorMessages)
@foreach($errorMessages作为$errorMessage)
-
{{$errorMessage}}
@endforeach
@endforeach
@恩迪夫
不错!我试试看。非常感谢。我决定走另一条路,稍后我会发布更新的代码