Installation
composer require denisok94/symfony-export
(Note: This is a Symfony package—Laravel integration requires manual adaptation via Symfony’s HttpFoundation or a facade wrapper.)
First Use Case: CSV Export
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpFoundation\StreamedResponse;
// Sample data (replace with Eloquent query or collection)
$data = [
['id' => 1, 'name' => 'John'],
['id' => 2, 'name' => 'Jane'],
];
// Stream CSV response
$response = new StreamedResponse(
fn() => \Symfony\Component\Serializer\Serializer::encode(
$data,
'csv',
['headers' => ['id', 'name']]
),
200,
['Content-Type' => 'text/csv']
);
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
'export.csv'
);
return $response;
Where to Look First
src/Serializer/Encoder/CsvEncoder.php (custom encoder if needed).spatie/laravel-export) for tighter integration.use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
$normalizer = new ObjectNormalizer();
$normalized = $normalizer->normalize($users->toArray(), null, [
'ignored_attributes' => ['pivot', 'timestamps'],
'callbacks' => [
'name' => fn($name) => ucfirst($name),
],
]);
CsvEncoder for complex formats (e.g., nested arrays → tab-separated).// app/Http/Middleware/ExportMiddleware.php
public function handle($request, Closure $next) {
if ($request->wantsJson() && $request->has('export')) {
return $this->export($request);
}
return $next($request);
}
// app/Services/ExportService.php
public function toCsv($data, string $filename) {
$serializer = new Serializer([new ObjectNormalizer()], [new CsvEncoder()]);
$csv = $serializer->serialize($data, 'csv');
return response($csv, 200)->header('Content-Disposition', "attachment; filename=$filename");
}
$chunkSize = 1000;
$users->chunk($chunkSize, function ($chunk) use ($response) {
$csv = (new Serializer())->serialize($chunk, 'csv');
$response->write($csv);
});
$response->send();
if ($request->header('Accept') === 'text/csv') {
return $this->exportService->toCsv($data, 'report.csv');
}
Symfony Dependencies:
symfony/http-foundation or symfony/serializer will break the package. Install via Composer:
composer require symfony/http-foundation symfony/serializer
symfony:^6.0 for compatibility.CSV Encoding Issues:
['headers' => ['\xEF\xBB\xBF' . 'id', 'name']] to force UTF-8.['csv_encoding' => 'UTF-8', 'csv_escape' => '"'].Memory Limits:
Allowed memory size exhausted. Use StreamedResponse (as shown above) or chunk data.No Built-in Laravel Facade:
response()->export()). Create a facade or use a wrapper like:
// app/Exports/ExportFacade.php
class ExportFacade extends \Illuminate\Support\Facades\Facade {
protected static function getFacadeAccessor() {
return new ExportService();
}
}
$serializer = new Serializer();
try {
$serializer->serialize($data, 'csv');
} catch (\Exception $e) {
dd($e->getMessage(), $data); // Check for invalid keys/values
}
\Log::debug('Response Headers:', [
'Content-Type' => $response->headers->get('Content-Type'),
'Disposition' => $response->headers->get('Content-Disposition'),
]);
Custom Encoders:
Symfony\Component\Serializer\Encoder\EncoderInterface for formats like JSONL or XML:
class JsonlEncoder implements EncoderInterface {
public function encode($data, $format, array $context = []) {
return implode("\n", array_map('json_encode', $data));
}
// ... other methods
}
$serializer = new Serializer([], [new JsonlEncoder()]);
Pre/Post-Processing:
Normalizer callbacks or Context to modify data before export:
$context = [
'csv_headers' => ['custom_id', 'formatted_name'],
'csv_separator' => ';',
];
Laravel Service Provider:
// app/Providers/AppServiceProvider.php
public function register() {
$this->app->singleton(Serializer::class, fn() => new Serializer(
[new ObjectNormalizer()],
[new CsvEncoder()]
));
}
cursor() or chunk() for Eloquent queries to reduce memory usage.APP_DEBUG=false in production.maatwebsite/excel (for advanced Excel/CSV).spatie/laravel-data-export (Laravel-native).How can I help you explore Laravel packages today?