sonata-project/exporter
SonataExporter is a lightweight PHP library for exporting data to multiple formats (CSV, XLS, JSON, XML). It provides writers, handlers, and iterators to stream large datasets efficiently and integrate easily into Symfony apps and services.
## Getting Started
### **Minimal Setup**
1. **Installation**
```bash
composer require sonata-project/exporter
First Use Case: Exporting Data to CSV
use Sonata\Exporter\CsvFile\CsvExporter;
use Sonata\Exporter\CsvFile\CsvFileBuilder;
$exporter = new CsvExporter();
$exporter->setData($yourArrayData); // Array of associative arrays
$exporter->generate(new CsvFileBuilder());
// Output to browser
$exporter->sendHttpResponse('export.csv');
Where to Look First
CsvExporter, ExcelExporter, and CsvFileBuilder for CSV/Excel exports.DoctrineDBALConnectionSourceIterator now works with doctrine/dbal 4.x.Dynamic Export from Controller
public function export(Request $request, CsvExporter $exporter)
{
$data = YourModel::query()->get()->toArray();
$exporter->setData($data);
$builder = new CsvFileBuilder();
$builder->setDelimiter(';'); // Custom delimiter
$exporter->generate($builder);
return $exporter->sendHttpResponse('custom_export.csv');
}
CsvExporter/ExcelExporter.Reusable Export Services
class UserExporterService
{
public function __construct(private CsvExporter $exporter) {}
public function exportActiveUsers(): string
{
$this->exporter->setData(User::active()->get()->toArray());
$builder = new CsvFileBuilder();
$builder->setFields(['id', 'name', 'email']);
$this->exporter->generate($builder);
return $this->exporter->generateOutput();
}
}
Doctrine Query Export (Updated for DBAL 4)
use Sonata\Exporter\Doctrine\DoctrineDBALConnectionSourceIterator;
$connection = \DBAL::getConnection(); // Laravel DBAL connection
$iterator = new DoctrineDBALConnectionSourceIterator(
$connection,
'SELECT * FROM users WHERE active = 1'
);
$exporter = new CsvExporter();
$exporter->setData($iterator);
$exporter->generate(new CsvFileBuilder());
Excel Exports
$exporter = new \Sonata\Exporter\ExcelFile\ExcelExporter();
$exporter->setData($yourData);
$exporter->generate(new \Sonata\Exporter\ExcelFile\ExcelFileBuilder());
return $exporter->sendHttpResponse('report.xlsx');
$builder->addFieldDescription('created_at', new \Sonata\Exporter\FieldDescription(
'created_at',
'Date',
fn ($value) => (new \Carbon\Carbon($value))->format('Y-m-d')
));
$exporter->setData(
$connection->executeQuery('SELECT * FROM large_table')->iterateAssociative()
);
PHP/Doctrine Version Mismatch
Class 'Doctrine\DBAL\Connection' not found or Method "iterateAssociative" does not exist.doctrine/dbal to ^4.0 and ensure PHP 8.2+:
composer require doctrine/dbal:^4.0
Symfony Version Conflicts
symfony/* packages are 8.0+.composer require symfony/*:^8.0 and update config/packages/.Memory Limits with DBAL Iterators
iterateAssociative() and process in batches.Field Naming Collisions
class or private may break exports.$builder->setFields(['id', 'name']); // Only export these
Inspect DBAL Iterators
$iterator = new DoctrineDBALConnectionSourceIterator($connection, 'SELECT * FROM users');
foreach ($iterator as $row) {
dump($row); // Verify data structure
}
Check Symfony Kernel
For Symfony users, ensure your Kernel extends Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait (Symfony 8+).
Log Export Errors
try {
$exporter->generate($builder);
} catch (\Throwable $e) {
\Log::error('Export failed: ' . $e->getMessage(), ['trace' => $e->getTraceAsString()]);
}
Custom Exporters for New Formats
Extend AbstractExporter (e.g., JSON, XML):
class JsonExporter extends AbstractExporter
{
protected function generateFileContent(): string
{
return json_encode($this->data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
}
Doctrine Event Subscribers Hook into DBAL events for pre-processing:
$connection->getEventManager()->addListener(
\Doctrine\DBAL\Connection::EVENT_QUERY,
fn ($event) => dump($event->getSql()) // Log queries
);
Laravel Service Providers Register exporters as singletons:
public function register()
{
$this->app->singleton(CsvExporter::class, fn () => new CsvExporter());
}
iterateAssociative() replaces older iterator methods.$iterator = $connection->executeQuery('SELECT * FROM users')->iterateAssociative();
# config/services.yaml
Sonata\Exporter\CsvFile\CsvExporter: ~
DoctrineDBALConnectionSourceIterator compatibility.
NO_UPDATE_NEEDED would **not** apply here due to breaking changes (PHP/Symfony/Doctrine version drops) and new compatibility features.
How can I help you explore Laravel packages today?