bakame/psr7-csv-factory

一个从 PSR-7 StreamInterface 获取联赛 CSV 对象的工厂

dev-master / 1.x-dev 2021-08-09 14:49 UTC

This package is auto-updated.

Last update: 2024-09-04 21:12:38 UTC


README

此包允许将 PSR-7 StreamInterface 对象 转换为 PHP 流。这使得可以使用期望 PHP 流资源的函数和类,例如 League CSV 对象 包。

包含的 StreamWrapper 类在很大程度上受到迈克尔·道林(Michael Dowling)编写的优秀 Guzzle/Psr7 包的启发/复制,该包使用 MIT 许可证

要求

您需要 PHP >= 7.3,但建议使用 PHP 的最新稳定版本。

安装

使用 Composer 安装 bakame/psr7-adapter

$ composer require bakame/psr7-adapter

文档

StreamWrapper::streamToResource

StreamWrapper::streamToAppendableResource

<?php

use Psr\Http\Message\StreamInterface;
use Bakame\Psr7\Adapter\StreamWrapper;

public static StreamWrapper::streamToResource(StreamInterface $stream): resource;
public static StreamWrapper::streamToAppendableResource(StreamInterface $stream): resource;

从 PSR-7 StreamInterface 对象返回一个 PHP 流资源。

参数

  • $stream : 一个实现了 PSR-7 StreamInterface 接口的对象。

返回值

一个 PHP 流资源

异常

当遇到以下情况时,将触发 Bakame\Psr7\Adapter\UnableToWrapStream 异常

  • 如果 StreamInterface 不可读或不可写
  • 如果无法创建流资源。

使用示例

这里有一个使用 League\Csv 的简单示例。

<?php

use Bakame\Psr7\Adapter\StreamWrapper;
use League\Csv\Reader;
use League\Csv\Writer;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;

final class CsvDelimiterSwitcherAction
{
    public function __construct(
        private string $inputDelimiter,
        private string $outputDelimiter
    ) {
    }

    public function __invoke(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
    {
        //let's create a CSV Reader object from the submitted file
        $inputCsv = $request->getUploadedFiles()['csv'];
        $reader = Reader::createFromStream(
            StreamWrapper::streamToResource($inputCsv->getStream())
        );
        $reader->setDelimiter($inputDelimiter);
        
        $psr7stream = $response->getBody();
        $psr7stream->write($reader->getInputBOM());
    
        //let's create a CSV Writer object from the response body
        //because we already wrote to the stream we need to have an appendable resource 
        $writer = Writer::createFromStream(
            StreamWrapper::streamToAppendableResource($psr7stream);
        );
        //we convert the delimiter
        $writer->setDelimiter($outputDelimiter);
        $writer->insertAll($reader);
    
        //we add CSV header to enable downloading the converter document
        return $response
            ->withHeader('Content-Type', 'text/csv, charset=utf-8')
            ->withHeader('Content-Transfer-Encoding', 'binary')
            ->withHeader('Content-Description', 'File Transfer')
            ->withHeader('Content-Disposition', 'filename=csv-'.(new DateTimeImmutable())->format('Ymdhis').'.csv')
        ;
    }
}

在这两种情况下,StreamInterface 对象都不会从其父对象(例如,Request 对象或 Response 对象)分离或删除,CSV 对象通过 resource_from 返回的适配器流在其 StreamInterface 属性上操作。

测试

此包有

  • 一个 PHPUnit 测试套件
  • 一个使用 PHP CS Fixer 的编码风格合规性测试套件。
  • 一个使用 PHPStan 的代码分析合规性测试套件。

要从项目目录中运行测试,请运行以下命令。

$ composer test

贡献

欢迎贡献,并将得到充分认可。请参阅 CONTRIBUTINGCONDUCT 了解详情。

安全性

如果您发现任何安全问题,请通过电子邮件 nyamsprod@gmail.com 而不是使用问题跟踪器。

鸣谢

许可证

MIT 许可证 (MIT)。请参阅 LICENSE 了解更多信息。