微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Laravel-excel 中使用 Multisheets 获取验证错误消息

如何解决如何在 Laravel-excel 中使用 Multisheets 获取验证错误消息

我正在按照文档中的 this 示例来处理多张工作表导入。

我的控制器:

    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']
        ];
    }     
}

我的多表导入类 MultisheetContactsImport.PHP

class MultisheetContactsImport extends ContactsImport implements WithMultipleSheets
{  
    public function sheets(): array
    {
        return [
            'Contacts' => new ContactsImport()
        ];       
    }    
}

如果我使用没有多表的 ContactsImport 类,则方法失败和 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。