通过Zend Diactoros封装的PhpInputStream (PSR-7 StreamInterface)传递流



我必须写一些东西来处理通过POST发送的XML文档。该文档内部有base-64编码的二进制文件,因此请求可能相当大。

如此:

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

但是我正在使用Zend Diactoros PSR-7实现,所以我真的应该这样做:

$request  = ZendDiactorosServerRequestFactory::fromGlobals();
$document = simplexml_load_file($request->getBody());

但是,这会导致流被强制转换为字符串,从而导致错误。

我真正需要的是:

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

因为:

var_dump($request->getBody());
object(ZendDiactorosPhpInputStream)#5 (4) {
  ["cache":"ZendDiactorosPhpInputStream":private] => string(0) ""
  ["reachedEof":"ZendDiactorosPhpInputStream":private ] => bool(false)
  ["resource":protected] => resource(4) of type (stream)
  ["stream":protected] => string(11) "php://input"
}

但注意->stream是受保护的。我应该扩展ZendDiactorosPhpInputStream并编写一个公开->stream的公共方法吗?还是有更好的办法?


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

我在GitHub repo上问。解决方案是将流资源与包装器对象分离。您可以不再使用包装器,但至少从框架中调用流资源,因此至少实现了一些解耦。

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

相关内容

  • 没有找到相关文章