2016-09-23 9 views
0

POST経由で送信されたXML文書を処理するために何かを書く必要があります。この文書には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 
関連する問題