首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下载Mezzio框架中的CSV (Zend/Laminas)

下载Mezzio框架中的CSV (Zend/Laminas)
EN

Stack Overflow用户
提问于 2020-09-25 05:57:41
回答 3查看 290关注 0票数 0

在Mezzion框架中,我有下一个处理程序:

代码语言:javascript
复制
 <?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'"
        ]);
    }
}

我有以下错误:

代码语言:javascript
复制
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?谢谢

EN

回答 3

Stack Overflow用户

发布于 2020-09-25 20:58:01

您收到的错误提示您的方法签名与接口的方法签名不兼容。

RequestHandlerInterface:

代码语言:javascript
复制
interface RequestHandlerInterface
{
    public function handle(ServerRequestInterface $request): ResponseInterface;
}

如您所见,签名声明返回了一个ResponseInterface类型的对象。

您修改了签名:

代码语言:javascript
复制
class DownloadBgcReportHandler implements RequestHandlerInterface
{
    public function handle(ServerRequestInterface $request): TextResponse;
}

签名必须与相同,但这样您就可以毫无问题地返回TextResponse (因为它扩展了实现Psr\Http\Message\ResponseInterfaceLaminas\Diactoros\Response )

只要改变这一点,它就会起作用:)

票数 3
EN

Stack Overflow用户

发布于 2020-09-25 07:03:15

您已经修改了处理方法,所以现在还不能满足RequestHandlerInterface的要求

票数 1
EN

Stack Overflow用户

发布于 2021-10-03 16:33:51

将处理程序的返回值替换为接口中强制执行的ResponseInterfaceRequestHandlerInterface

所以我认为最好的帮助是:

代码语言:javascript
复制
<?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()的两行,因为所需的参数$filename是空的(我不想在这里做决定),并添加了一行Writer::createFromString()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64054991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档