2016-09-23 11 views
0

POST를 통해 전송 된 XML 문서를 처리하기 위해 무언가를 작성해야합니다. 이 문서는 내부에 Base-64로 인코딩 된 바이너리를 가지고 있기 때문에 요청이 상당히 클 수 있습니다.Zend Diactoros PhpInputStream (PSR-7 StreamInterface)이 fopen과 같은 함수로 래핑 된 패스 스트림?

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

하지만 난 정말이 같은 일을해야하므로 젠드 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