Installation:
composer require antqa/dataexporter-bundle
Register the bundle in config/bundles.php (Symfony 5+ auto-discovers it).
First Export (CSV):
use AntQa\DataExporterBundle\Exporter\CsvExporter;
use AntQa\DataExporterBundle\Exporter\ExporterInterface;
$exporter = new CsvExporter();
$data = [['id' => 1, 'name' => 'Item 1'], ['id' => 2, 'name' => 'Item 2']];
$csv = $exporter->export($data);
file_put_contents('export.csv', $csv);
First Use Case:
Export a Doctrine Collection to CSV via a controller:
use AntQa\DataExporterBundle\Exporter\CsvExporter;
use Symfony\Component\HttpFoundation\Response;
public function exportAction(ExporterInterface $exporter, EntityManagerInterface $em): Response
{
$data = $em->getRepository(Product::class)->findAll();
$csv = $exporter->export($data, ['id', 'name', 'price']);
return new Response($csv, 200, ['Content-Type' => 'text/csv']);
}
CsvExporter, XmlExporter, JsonExporter, XlsExporter, HtmlExporter (all implement ExporterInterface).config/packages/antqa_data_exporter.yaml.{{ dump(data) | export_to_csv }} in templates (if Twig extension is enabled).Data Preparation:
Collection → array via map() or toArray()).['id', 'name']) or rely on auto-detection (risky for nested objects).Exporter Selection:
// Dependency Injection (recommended)
public function __construct(
private CsvExporter $csvExporter,
private XlsExporter $xlsExporter
) {}
// Runtime selection
$exporter = match ($format) {
'csv' => $csvExporter,
'xls' => $xlsExporter,
default => throw new \InvalidArgumentException('Unsupported format'),
};
Export Execution:
$exporter->exportToFile($data, 'path/to/export.csv');
return new Response(
$exporter->export($data),
200,
['Content-Type' => 'text/csv', 'Content-Disposition' => 'attachment; filename="export.csv"']
);
$csv = $exporter->export($data);
return json_encode(['data' => base64_encode($csv)]);
Custom Headers/Footers:
$exporter->setHeader(['Custom Header']);
$exporter->setFooter(['Custom Footer']);
$exporter->export($data);
Dynamic Field Mapping:
$exporter->setFieldMapping([
'product_id' => 'id',
'product_name' => 'name',
'formatted_price' => function ($item) {
return '$' . number_format($item['price'], 2);
},
]);
Batch Processing:
$chunkSize = 1000;
$offset = 0;
while ($products = $em->getRepository(Product::class)->findBy([], [], $chunkSize, $offset)) {
$exporter->exportToFile($products, "export_$offset.csv");
$offset += $chunkSize;
}
Event Listeners: Extend functionality via Symfony events (e.g., pre-export data transformation):
// config/services.yaml
services:
App\EventListener\ExportListener:
tags:
- { name: kernel.event_listener, event: antqa.data_exporter.pre_export, method: onPreExport }
Twig Integration:
{# Export a collection to CSV via Twig filter #}
<a href="{{ path('export') | export_to_csv(data) }}">Download CSV</a>
Memory Limits:
exportToFile() or stream data in chunks.Nested Objects:
User::getAddress()).setFieldMapping():
$exporter->setFieldMapping([
'address_city' => function ($user) {
return $user->getAddress()->getCity();
},
]);
Excel (XLS) Quirks:
XlsExporter uses phpoffice/phpspreadsheet under the hood.setOutputEncoding('UTF-8') for non-ASCII data.XlsxExporter (if available) for modern Excel files.XML/HTML Escaping:
<, >, &) in data may break XML/HTML output.setEscapeHtml(true) for HTML or ensure data is sanitized.Symfony 5.4+ Compatibility:
$exporter->setDebug(true); // Logs raw data before export
$exporter->setHeader([]); // Reset if needed
var_dump($exporter->getExportedData()) to inspect the final array before export.Custom Exporters:
Extend AbstractExporter to add new formats (e.g., PDF via Dompdf):
class PdfExporter extends AbstractExporter
{
protected function exportData(array $data): string
{
$dompdf = new \Dompdf\Dompdf();
$dompdf->loadHtml($this->renderHtml($data));
return $dompdf->output();
}
}
Override Default Exporters:
Bind custom exporters in config/services.yaml:
services:
AntQa\DataExporterBundle\Exporter\CsvExporter:
class: App\Exporter\CustomCsvExporter
Pre/Post-Export Events:
Listen for antqa.data_exporter.pre_export and antqa.data_exporter.post_export:
public function onPreExport(PreExportEvent $event)
{
$event->setData($this->transformData($event->getData()));
}
Configuration Overrides:
Override defaults in config/packages/antqa_data_exporter.yaml:
antqa_data_exporter:
default_format: 'xls' # Override default exporter
csv:
delimiter: ';' # Custom CSV delimiter
enclosure: '"'
setFieldMapping()) for better performance and predictability.$handle = fopen('large_export.csv', 'w');
foreach ($data as $row) {
fputcsv($handle, $row);
}
fclose($handle);
// services.yaml
services:
App\Service\ExportService:
arguments:
$csvExporter: '@AntQa\DataExporterBundle\Exporter\CsvExporter'
How can I help you explore Laravel packages today?