dev-master
9999999-dev https://github.com/bakame-php/psr7-csv-factorya factory to return league csv object from PSR-7 StreamInterface
MIT
The Requires
The Development Requires
psr-7 csv read write export import
Wallogit.com
2017 © Pedro Peláez
a factory to return league csv object from PSR-7 StreamInterface
This package enables converting a PSR-7 StreamInterface objects into a PHP stream. This make it possible to work with functions and class which expect a PHP stream resource like League CSV object package., (*1)
The included StreamWrapper class is heavily inspired/copied from the excellent Guzzle/Psr7 package written by Michael Dowling which uses the MIT License, (*2)
You need PHP >= 7.3 but the latest stable version of PHP is recommended. - A PSR-7 http mesage implementation (Diactoros, Guzzle, Slim, etc...), (*3)
Install bakame/psr7-adapter using Composer., (*4)
$ composer require bakame/psr7-adapter
<?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;
returns a PHP stream resource from a PSR-7 StreamInterface object., (*5)
$stream : a object implementing PSR-7 StreamInterface interface.A PHP stream resource, (*6)
A Bakame\Psr7\Adapter\UnableToWrapStream will be triggered when the following situations are encountered:, (*7)
StreamInterface is not readable and writableHere's a simple usage with League\Csv., (*8)
<?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')
;
}
}
In both cases, the StreamInterface objects are never detached or removed from their parent objects (ie the Request object or the Response object), the CSV objects operate on their StreamInterface property using the adapter stream returned by resource_from., (*9)
The package has:, (*10)
To run the tests, run the following command from the project folder., (*11)
bash
$ composer test, (*12)
Contributions are welcome and will be fully credited. Please see CONTRIBUTING and CONDUCT for details., (*13)
If you discover any security related issues, please email nyamsprod@gmail.com instead of using the issue tracker., (*14)
The MIT License (MIT). Please see LICENSE for more information., (*15)
a factory to return league csv object from PSR-7 StreamInterface
MIT
psr-7 csv read write export import