Installation
composer require davask/exim
Ensure your project uses Symfony 5.4+ or Laravel 8+ (via Symfony bridge) with SonataAdminBundle (if leveraging CMS features).
Configuration
php artisan vendor:publish --provider="Davask\Exim\EximServiceProvider"
config/exim.php with your database/environment settings.config/bundles.php (Symfony) or ensure Laravel’s service provider is loaded.First Use Case
Exim\Exporter facade to export a model’s data to CSV/Excel:
use Davask\Exim\Facades\Exporter;
$data = Model::all()->toArray();
Exporter::export($data, 'export.csv', 'text/csv');
use Davask\Exim\Sonata\ExporterButton;
class PostAdmin extends AbstractCRUDController {
public function configureButtons() {
$this->addButton(new ExporterButton());
}
}
Data Export
Exporter::export() with Eloquent collections:
$users = User::with('roles')->get();
Exporter::export($users, 'users.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
Exporter::map():
Exporter::map($users, function ($user) {
return [
'name' => $user->name,
'email' => strtolower($user->email),
'role' => $user->roles->first()->name,
];
});
Import Workflows
Importer::import() with validation:
$imported = Importer::import('file.csv', User::class, [
'name' => 'Name',
'email' => 'Email',
]);
Importer::import('large_file.xlsx', User::class, [], 100); // 100 rows per chunk
SonataAdmin Integration
$this->addButton(new ExporterButton('Export', 'export'), 'list', 'top');
ExporterButton to modify behavior:
class CustomExporterButton extends ExporterButton {
protected function getExportData() {
return Model::query()->where('active', true)->get();
}
}
API Endpoints
Route::get('/export/users', function () {
return Exporter::export(User::all(), 'users.json', 'application/json');
});
StreamedResponse for memory efficiency:
return new StreamedResponse(function () {
$handle = fopen('php://output', 'w');
fputcsv($handle, ['name', 'email']);
foreach (User::chunk(100) as $chunk) {
foreach ($chunk as $user) {
fputcsv($handle, [$user->name, $user->email]);
}
}
fclose($handle);
}, 200, ['Content-Type' => 'text/csv']);
Memory Limits
memory_limit.Exporter::stream() if available).memory_limit in php.ini temporarily or use set_time_limit().SonataAdmin Compatibility
sonata-project/admin-bundle version in composer.json (target ~3.50).php bin/console cache:clear
CSV/Excel Encoding
é, ñ) may corrupt files.Exporter::export(array_map(function ($item) {
return mb_convert_encoding($item, 'UTF-8');
}, $data), 'export.csv');
Validation Errors
Importer::import('file.csv', User::class, [], [], true); // $debug = true
Exporter::export($data, 'log:export.log', 'text/plain'); // For debugging
config/exim.php for correct database/queue settings.Custom Writers
Davask\Exim\Writer\AbstractWriter to support new formats (e.g., PDF):
class PdfWriter extends AbstractWriter {
public function write(array $data, string $filename) {
// Use Dompdf or similar
}
}
config/exim.php:
'writers' => [
'pdf' => Davask\Exim\Writer\PdfWriter::class,
],
Pre/Post-Import Hooks
EventServiceProvider:
public function boot() {
Event::listen(EximEvents::PRE_IMPORT, function ($event) {
// Modify $event->data before import
});
}
Queue Exports
ExportJob::dispatch(User::all(), 'export.xlsx')->delay(now()->addMinute());
ExportJob:
class ExportJob implements ShouldQueue {
use Dispatchable, InteractsWithQueue;
public function handle() {
Exporter::export($this->data, $this->filename);
}
}
DB::transaction(function () use ($data) {
Importer::import('file.csv', Model::class, $mapping);
});
/tmp in production; use storage_path('app/exports') instead.How can I help you explore Laravel packages today?