bakame / psr7-csv-factory
一个从 PSR-7 StreamInterface 获取联赛 CSV 对象的工厂
Requires
- php: >=7.3
- psr/http-message: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- league/csv: ^9.7.0
- nyholm/psr7: ^1.4
- phpstan/phpstan: ^0.12.10
- phpstan/phpstan-phpunit: ^0.12.21
- phpstan/phpstan-strict-rules: ^0.12.10
- phpunit/phpunit: ^9.5.0
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-7StreamInterface
接口的对象。
返回值
一个 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
贡献
欢迎贡献,并将得到充分认可。请参阅 CONTRIBUTING 和 CONDUCT 了解详情。
安全性
如果您发现任何安全问题,请通过电子邮件 nyamsprod@gmail.com 而不是使用问题跟踪器。
鸣谢
许可证
MIT 许可证 (MIT)。请参阅 LICENSE 了解更多信息。