Currently supported:
- CSV
- XLSX
- XML
composer require audunru/export-responseDepending on which formats you want to export to, you will have to install additional packages:
| Format | Package |
|---|---|
| CSV | spatie/simple-excel |
| XLSX | spatie/simple-excel |
| XML | spatie/array-to-xml |
To allow exports for all your API endpoints, add middleware to Kernel.php:
'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\audunru\ExportResponse\Middleware\ExportCsv::class,
\audunru\ExportResponse\Middleware\ExportXlsx::class,
\audunru\ExportResponse\Middleware\ExportXml::class,
],To add it to one particular API resource, you can use this in api.php:
Route::apiResource('documents', DocumentController::class)
->middleware([
ExportCsv::class,
ExportXlsx::class,
ExportXml::class
])
->name('documents');You can specify an array key which will be used to retrieve the data. "Dot" notation is supported.
Route::apiResource('documents', DocumentController::class)
->middleware([
ExportCsv::with([
'key' => 'data',
]),
ExportXlsx::with([
'key' => 'data',
]),
ExportXml::class::with([
'key' => 'data',
]),
])
->name('documents');You can also add the middleware to the $middlewareGroups and $routeMiddleware arrays in app/Http/Kernel.php:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
// Add ExportCsv middleware to all requests. "data" is the name of
// the key to retrieve using "dot" notation.
'csv:data',
],
];
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'csv' => \audunru\ExportResponse\Middleware\ExportCsv::class,
];Instead of using middleware, you can perform the export in the controller:
class ProductController extends Controller
{
public function csv()
{
$products = Product::all();
return $products->toCsv('filename.csv');
}Lazy collections are also supported:
class ProductController extends Controller
{
public function csv()
{
$products = Product::lazy();
return $products->toCsv('filename.csv');
}Please use lazy collections when you can. During testing, using Product::lazy() to export 10,000 products took about 2MB of memory, compared to 44 MB of memory using Product::all(). Both exports took the same amount of time (around 45 seconds).
In order to retrieve an API response as CSV instead of JSON, send a request to your API with the Accept header set to text/csv.
For XML, set the header to application/xml.
For XLSX, set the header to application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.
Publish the configuration file by running:
php artisan vendor:publish --tag=export-response-configRun tests:
composer test