gsferro/livewire-import-easy
Componente Livewire (v3) pronto para importação “easy” de arquivos no Laravel 10+ usando maatwebsite/excel. Estenda LivewireImportEasy, defina a classe de importação, personalize accept, rótulo, ícone e mensagens de progresso/finalização.
composer require gsferro/livewire-import-easy
php artisan vendor:publish --provider="Gsferro\LivewireImportEasy\Providers\LivewireImportEasyServiceProvider" --force
use Gsferro\LivewireImportEasy\Livewire\LivewireImportEasy;
class YourImportComponent extends LivewireImportEasy
{
public string $importClass = \App\Imports\YourImportClass::class;
public ?string $accept = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel';
}
<x-livewire-import-easy
:accept="$accept"
:label="'Import CSV'"
:icon="'fa-solid fa-file-import'"
/>
Create a basic import class (e.g., app/Imports/YourImportClass.php) to handle the import logic:
use Maatwebsite\Excel\Concerns\ToModel;
class YourImportClass implements ToModel
{
public function model(array $row)
{
return new YourModel([
'column1' => $row[0],
'column2' => $row[1],
]);
}
}
Component Extension:
Extend LivewireImportEasy and define:
$importClass: Path to your import class (e.g., App\Imports\YourImportClass).$accept: MIME types for file upload (e.g., 'application/vnd.ms-excel' for .xls).Customization: Override default messages, labels, or icons:
public string $importingMessage = 'Processing file...';
public string $label = 'Upload Data';
Integration with Excel:
Use maatwebsite/excel concerns (ToModel, WithHeadingRow, etc.) in your import class.
Handling Events:
Listen to importing and importFinished states for UI feedback:
@if($importing)
<div class="alert">{{ $importingMessage }}</div>
@endif
Batch Processing:
Implement WithBatchInserts or WithChunkReading in your import class for large files:
use Maatwebsite\Excel\Concerns\WithBatchInserts;
class LargeFileImport implements WithBatchInserts
{
public function batchSize(): int
{
return 1000;
}
}
Validation: Add validation in your import class:
use Maatwebsite\Excel\Concerns\WithValidation;
class ValidatedImport implements WithValidation
{
public function rules(): array
{
return [
'column1' => 'required|email',
];
}
}
Dynamic Imports:
Use a dynamic $importClass based on user input:
public string $importClass;
public function mount()
{
$this->importClass = request('import_type') === 'csv'
? \App\Imports\CSVImport::class
: \App\Imports\ExcelImport::class;
}
Missing Dependencies:
Ensure maatwebsite/excel is installed and configured. Run:
composer require maatwebsite/excel
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config
File Size Limits:
Default PHP upload limits may block large files. Adjust in php.ini or .env:
upload_max_filesize = 20M
post_max_size = 20M
Livewire State Persistence: Avoid storing large datasets in Livewire properties. Use database transactions or queues for heavy imports.
Icon/Font Issues:
Ensure fa-solid or your chosen icon library is loaded in Blade:
@vite(['resources/css/app.css', 'resources/js/app.js'])
Check Import Logs: Enable Laravel logging in your import class:
use Illuminate\Support\Facades\Log;
public function model(array $row)
{
Log::debug('Importing row:', $row);
return new YourModel(...);
}
Validate File Types: Explicitly check file types in your component:
public function updatedFile($file)
{
if (!$file || !in_array($file->getClientMimeType(), explode(',', $this->accept))) {
$this->addError('file', 'Invalid file type.');
}
}
Custom UI Components:
Override the default Blade component (livewire-import-easy.blade.php) by publishing and modifying:
php artisan vendor:publish --tag=livewire-import-easy-views
Post-Import Actions: Trigger actions after import (e.g., notifications, redirects):
protected function importFinished()
{
session()->flash('success', $this->importFinishedMessage);
return redirect()->to('/dashboard');
}
Multi-Step Imports:
Use Livewire’s emit() to communicate between components during import:
$this->emit('import-progress', ['step' => 1, 'total' => 100]);
Localization: Localize messages by extending the component and overriding text properties:
public string $importingMessage = trans('import.processing');
How can I help you explore Laravel packages today?