Дано — таблица с большим количеством записей.
Задача — отдать пользователю данные из этой таблицы в формате CSV без создания промежуточного файла. Данные нужно отдавать по мере их генерации.
class ExportProductsController implements ContainerInjectionInterface {
use AutowireTrait;
public function __construct(
private Connection $database,
) {}
public function __invoke(Request $request): Response {
$result = $this->database->select('product', 'p')->fields('p')->execute();
$stdout = fopen('php://output', 'w');
return new StreamedResponse(function () use ($result, $stdout) {
fputcsv($stdout, ['sku', 'name', 'price']);
foreach ($result as $row) {
fputcsv($stdout, [$row->sku, $row->name, $row->price]);
flush();
}
}, headers: [
'Content-Type' => 'text/csv; charset=utf-8',
// Disable nginx buffering.
'X-Accel-Buffering' => 'no',
]);
}
}
Написанное актуально для
Drupal 11+
Похожие записи
- FAQ по тестированию
- Внедрение зависимостей в контроллер
- Производительность EntityStorageInterface::load() vs EntityStorageInterface::loadMultiple()
- Производительность Entity Query vs Query Builder vs Sql query
- Отличие методов BaseFieldDefinition::setDefaultValue() и BaseFieldDefinition::setInitialValue()
Добавить комментарий