将 Zend Diactoros PhpInputStream(PSR-7 StreamInterface)包装的流传递给类似 fopen 的函数?

Pass stream wrapped by Zend Diactoros PhpInputStream (PSR-7 StreamInterface) to fopen-like function?

我必须写一些东西来处理通过 POST 发送的 XML 文档。该文档内部有 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 并编写一个 public 方法来公开 ->stream 吗?或者有更好的方法吗?


请注意:我正在寻找基于流的解决方案;不要将整个流作为字符串读入内存。

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