代码之家  ›  专栏  ›  技术社区  ›  giggsey

Guzzle:访问历史中间件中上载的文件

  •  2
  • giggsey  · 技术社区  · 7 年前

    我正在尝试访问Guzzle(v6)历史中间件中上载的文件。

    我的实际代码收到一个请求(因此使用 ServerRequestInterface ),然后使用Guzzle将请求发送到其他位置。

    我试图通过这一层测试上传的文件,但我似乎无法在Guzzle中间件返回的请求对象中访问它们。

    示例代码:

    <?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);
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   zstate    7 年前

    如果你遵循执行链, $client->send($request) 在某些情况下,呼叫私人 applyOptions 函数,该函数调用 Psr7\modify_request 作用如果你看 Psr7 \修改请求 function :

    ...
    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 作为构造函数中的参数)。这就是为什么你失去了 上载的文件 大堆

    更新 :

    我创建了一个 issue 和a pull request 来修复它。