2017-11-28 25 views
2

Guzzle (v6) 용 히스토리 미들웨어에서 업로드 된 파일에 액세스하려고합니다.Guzzle : 히스토리 미들웨어에 업로드 된 파일에 액세스하십시오.

실제 코드가 요청을 수신 했으므로 (예 : ServerRequestInterface을 사용), Guzzle을 사용하여 요청을 다른 곳으로 보냅니다.

이 레이어를 통해 업로드 된 파일을 테스트하려고하는데 Guzzle의 미들웨어에서 반환 한 요청 개체에서 액세스 할 수 없습니다.

예제 코드 : 당신이 어떤 시점에서 실행 체인, $client->send($request)를 수행하면

<?php 


use GuzzleHttp\Client; 
use GuzzleHttp\Handler\MockHandler; 
use GuzzleHttp\HandlerStack; 
use GuzzleHttp\Middleware; 
use GuzzleHttp\Psr7\ServerRequest; 
use GuzzleHttp\Psr7\UploadedFile; 

class DoNotCommitTest extends \PHPUnit\Framework\TestCase 
{ 
    public function testUploads() 
    { 
     $request = new ServerRequest('GET', 'http://example.com/bla'); 

     $file = new UploadedFile('test', 100, \UPLOAD_ERR_OK); 

     $request = $request->withUploadedFiles([$file]); 
     $this->assertCount(1, $request->getUploadedFiles()); 

     // Mock Guzzle request, assert on the request it 'sent' 

     $mock = new MockHandler([ 
      function (ServerRequest $request, array $options) { 
       // This fails... 
       $this->assertCount(1, $request->getUploadedFiles()); 
      } 
     ]); 

     $historyContainer = []; 
     $history = Middleware::history($historyContainer); 

     $handler = HandlerStack::create($mock); 
     $handler->push($history); 

     $client = new Client(['handler' => $handler]); 

     $client->send($request); 
    } 
} 

답변

3

Psr7\modify_request 함수를 호출 개인 applyOptions 함수를 호출합니다. 당신이 Psr7\modify_requestfunction 보면 :

... 
if ($request instanceof ServerRequestInterface) { 
    return new ServerRequest(
     isset($changes['method']) ? $changes['method'] : $request->getMethod(), 
     $uri, 
     $headers, 
     isset($changes['body']) ? $changes['body'] : $request->getBody(), 
     isset($changes['version']) 
      ? $changes['version'] 
      : $request->getProtocolVersion(), 
     $request->getServerParams() 
    ); 
} 
... 

그것은 당신의 업로드 된 파일의 배열을 (ServerRequest 객체 생성자의 인수로 uploadedFiles이없는) 유지하지 않고 새로운 ServerRequest 개체를 반환합니다. 그래서 uploadedFiles 배열을 잃어버린 것입니다.

UPDATE는 :

나는 그것을 해결하기 위해 issuepull request를 만들었습니다.

+0

감사합니다. 나는 며칠 동안 떨어져 있었고 지금 막 문제를 열려고하고있었습니다. Guzzle의 PSR7 라이브러리에 버그가있는 것 같아요, 내가 잘못 사용했다고 걱정했는데. 나는 이것을 인정 된 대답으로 표시 할 것이고, 당신은 분명히 현상금을받을 자격이있다. – giggsey