Передать поток, завернутый Zend Diactoros PhpInputStream (PSR-7 StreamInterface), в функцию, подобную fopen?

Я должен написать что-то для обработки XML-документа, отправленного через POST. Документ содержит двоичные файлы в кодировке base-64, поэтому запрос может быть довольно большим.

Это работает:

$document = simplexml_load_file('php://input');

Но я использую реализацию Zend Diactoros PSR-7, поэтому на самом деле я должен делать что-то вроде этого:

$request  = Zend\Diactoros\ServerRequestFactory::fromGlobals();
$document = simplexml_load_file($request->getBody());

Однако это приводит к тому, что поток приводится к строке, что приводит к ошибке.

Что мне действительно нужно, это что-то вроде:

$document = simplexml_load_file($request->getBody()->stream);

Так как:

var_dump($request->getBody());

object(Zend\Diactoros\PhpInputStream)#5 (4) {
["cache":"Zend\Diactoros\PhpInputStream":private] => string(0) ""["reachedEof":"Zend\Diactoros\PhpInputStream":private ] => bool(false)
["resource":protected] => resource(4) of type (stream)
["stream":protected] => string(11) "php://input"}

Но обратите внимание ->stream защищен Должен ли я просто продлить Zend\Diactoros\PhpInputStream и написать публичный метод, чтобы выставить ->stream? Или есть лучший способ?


пожалуйста, обратите внимание: Я ищу потоковое решение; не читать весь поток в память как строку.

0

Решение

Я спросил на репозитории GitHub. Решение состоит в том, чтобы отделить ресурс потока от объекта-оболочки. Вы больше не можете использовать оболочку, но, по крайней мере, ресурс потока вызывается из фреймворка, так что по крайней мере достигается некоторая развязка.

$request  = Zend\Diactoros\ServerRequestFactory::fromGlobals();
$stream   = $request->getBody()->detach();
$metadata = stream_get_meta_data($stream);
$document = simplexml_load_file($metadata['uri']); // "php://input" is passed
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]