Drupal → Выдача CSV файла по мере генерации

09.09.2025

Дано — таблица с большим количеством записей.

Задача — отдать пользователю данные из этой таблицы в формате 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',
    ]);
  }

}

Подробнее про StreamedResponse

Написанное актуально для
Drupal 11+
Похожие записи

Добавить комментарий