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">&times;</a>
                </li>
            @endforeach
        @endforeach
    </ul>
</div>@endif
@if(计数($errors->getMessages())>0)
验证错误:
    @foreach($errors->getMessages()作为$errorMessages) @foreach($errorMessages作为$errorMessage)
  • {{$errorMessage}}
  • @endforeach @endforeach
@恩迪夫
不错!我试试看。非常感谢。我决定走另一条路,稍后我会发布更新的代码