2016-09-23 15 views
0

Мне нужно написать что-то для обработки XML-документа, отправленного через POST. В документе есть двоичные файлы с кодировкой base-64, поэтому запрос может быть довольно большим.Пропустить поток, завернутый Zend Diactoros PhpInputStream (PSR-7 StreamInterface) для функции типа fopen?

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

$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

I asked на репетиции 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