2017-11-28 1 views
2

Guzzle(v6)の履歴ミドルウェアでアップロードしたファイルにアクセスしようとしています。Guzzle:履歴ミドルウェアでアップロードしたファイルにアクセスする

私の実際のコードはリクエストを受け取り(したがってServerRequestInterfaceを使用しています)、Guzzleを使用してリクエストを他の場所に送ります。

このレイヤーを経由してアップロードされたファイルをテストしようとしていますが、Guzzleのミドルウェアから返されたRequestオブジェクトにアクセスできないようです。

例のコードは:あなたはいくつかの時点で実行チェーン、$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

関連する問題