簡體   English   中英

在 Mezzio 框架 (Zend/Laminas) 中下載 CSV

[英]Download CSV in Mezzio Framework (Zend/Laminas)

在 Mezzion 框架中,我有下一個處理程序:

 <?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? 謝謝

您收到的錯誤是告訴您您的方法簽名不符合接口的方法簽名。

請求處理程序接口:

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

只需改變它,它就會起作用:)

你已經修改了你的處理方法,所以現在你沒有滿足 RequestHandlerInterface 的要求

用接口中強制執行的ResponseInterface替換處理程序的返回值: RequestHandlerInterface

所以我認為你最好在以下方面得到幫助:

<?php

namespace Bgc\Handler;

use App\Service\GenerateReportToCSV;
use Bgc\Queue\BGCQueueManager;
use Laminas\Diactoros\Response;
use Laminas\Diactoros\Stream;
use League\Csv\Writer;
use Psr\Http\Message\ResponseInterface;
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): ResponseInterface
    {
        $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());
        $csv = Writer::createFromString($this->reportToCSV->getHeadingsBGC());

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

        $body = new Stream($csv->getContent());

        return new Response($body, 200, [
            'Cache-Control' => 'must-revalidate',
            'Content-Disposition' => 'attachment; filename=' . $fileName,
            'Content-Length' => strval($body->getSize()),
            'Content-Type' => 'text/csv',
            'Content-Transfer-Encoding' => 'binary',
            'Expires' => '0',
            'Pragma' => 'public',
        ]);
    }
}

PS:我已經評論了其中使用空的new \\SplFileObject()的 2 行,因為所需的參數$filename是空的(我不想在那里做出決定)並添加了一行Writer::createFromString()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM