2017-11-28 3 views
2

Ich versuche, auf eine hochgeladene Datei in der History-Middleware für Guzzle (v6) zuzugreifen.Guzzle: Greifen Sie auf hochgeladene Dateien in der History-Middleware zu

Mein tatsächlicher Code empfängt eine Anfrage (also verwendet die ServerRequestInterface), dann verwendet Guzzle, um die Anfrage an anderer Stelle zu senden.

Ich versuche, hochgeladene Dateien zu testen, die diese Ebene durchlaufen, aber ich kann nicht scheinen, auf sie in dem Request-Objekt zuzugreifen, das von Guzzle Middleware zurückgegeben wird.

Beispielcode:

<?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); 
    } 
} 

Antwort

3

Wenn Sie Ausführungskette, $client->send($request) an einem gewissen Punkt nennt private applyOptions Funktion folgen, die Psr7\modify_request Funktion aufruft. Wenn Sie bei Psr7\modify_requestfunction aussehen:

... 
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() 
    ); 
} 
... 

Es gibt neue ServerRequest Objekt ohne Ihre hochgeladenen Dateien Array zu Konservieren (ServerRequest Objekt nicht über die uploadedFiles als Argument im Konstruktor). Deshalb haben Sie Ihr uploadedFiles Array verloren.

UPDATE:

Ich habe ein issue und ein pull request es zu beheben.

+0

Danke. Ich war einige Tage weg und wollte gerade ein Problem lösen. Ich stimme zu, dass es ein Fehler in Guzzles PSR7-Bibliothek ist, obwohl ich befürchtete, dass ich es falsch benutze. Ich werde dies als die akzeptierte Antwort markieren, und Sie verdienen definitiv das Kopfgeld. – giggsey

Verwandte Themen