Скачать CSV в Mezzio Framework (Zend/Laminas)

В Mezzion Framework у меня есть следующий обработчик:

 <?php

namespace Bgc\Handler;

use App\Service\GenerateReportToCSV;
use Bgc\Queue\BGCQueueManager;
use Laminas\Diactoros\Response\TextResponse;
use League\Csv\Writer;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

class DownloadBgcReportHandler implements RequestHandlerInterface
{
    protected $bgcQManager;
    protected $reportToCSV;

    public function __construct(BGCQueueManager $bgcQManager, $reportToCSV)
    {
        $this->bgcQManager = $bgcQManager;
        $this->reportToCSV = $reportToCSV;
    }

    public function handle(ServerRequestInterface $request): TextResponse
    {
        $queryParams = $request->getQueryParams();
        $params = [];

        if (isset($queryParams['startDate'])) {
            $starDate = new \DateTime($queryParams['startDate']);
            $params['startDate'] = $starDate->modify('midnight');
        }

        if (isset($queryParams['startDate'])) {
            $endDate = new \DateTime($queryParams['endDate']);
            $params['endDate'] = $endDate->modify('tomorrow');
        }

        $itemsBGC = $this->bgcQManager->getDataToDownload($params);
        $time = time();
        $fileName = "bgc-report-$time.csv";

        $csv = Writer::createFromFileObject(new \SplFileObject());
        $csv->insertOne($this->reportToCSV->getHeadingsBGC());

        foreach ($itemsBGC as $item) {
            $csv->insertOne($item);
        }

        return new TextResponse($csv->getContent(), 200, [
            'Content-Type' => 'text/csv',
            'Content-Transfer-Encoding' => 'binary',
            'Content-Disposition' => "attachment; filename='$fileName'"
        ]);
    }
}

У меня есть следующая ошибка:

Whoops\Exception\ErrorException: Declaration of Bgc\Handler\DownloadBgcReportHandler::handle(Psr\Http\Message\ServerRequestInterface $request): Laminas\Diactoros\Response\TextResponse must be compatible with Psr\Http\Server\RequestHandlerInterface::handle(Psr\Http\Message\ServerRequestInterface $request): Psr\Http\Message\ResponseInterface in file /home/peter/proyectos/revelations-thena-api/src/Bgc/src/Handler/DownloadBgcReportHandler.php on line 20

Я не знаю, чтобы создать загружаемый файл. Hadbler отлично работает с Json. Я попытался перейти с ResponseInterface на TextResponse.

Как я могу скачать файл CSV? Спасибо


person Peter    schedule 24.09.2020    source источник


Ответы (2)


Полученная вами ошибка говорит о том, что подпись вашего метода не соответствует подписи метода интерфейса.

Интерфейс Обработчика Запросов:

interface RequestHandlerInterface
{
    public function handle(ServerRequestInterface $request): ResponseInterface;
}

Как видите, в сигнатуре указано, что возвращается объект типа ResponseInterface.

Вы изменили подпись:

class DownloadBgcReportHandler implements RequestHandlerInterface
{
    public function handle(ServerRequestInterface $request): TextResponse;
}

Подпись должна быть одинаковой, но тогда вы можете вернуть TextResponse без проблем (поскольку она расширяет Laminas\Diactoros\Response, который реализует Psr\Http\Message\ResponseInterface)

Просто измените это, и все заработает :)

person Ermenegildo    schedule 25.09.2020

Вы изменили метод обработки, поэтому сейчас вы не выполняете требования RequestHandlerInterface.

person Carlos Manuel Nacianceno    schedule 24.09.2020