Php Guzzle:访问历史中间件中上载的文件
我正在尝试访问Guzzle(v6)历史中间件中上载的文件 我的实际代码接收到一个请求(使用Php Guzzle:访问历史中间件中上载的文件,php,guzzle,psr-7,Php,Guzzle,Psr 7,我正在尝试访问Guzzle(v6)历史中间件中上载的文件 我的实际代码接收到一个请求(使用ServerRequestInterface),然后使用Guzzle将请求发送到其他地方 我试图通过这一层测试上传的文件,但我似乎无法在Guzzle的中间件返回的请求对象中访问它们 示例代码: <?php use GuzzleHttp\Client; use GuzzleHttp\Handler\MockHandler; use GuzzleHttp\HandlerStack; use Guzzl
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);
}
}
如果您遵循执行链,$client->send($request)
在某些点调用privateapplyOptions
函数,该函数调用Psr7\modify\u request
函数。如果查看Psr7\modify\u请求
:
它返回新的ServerRequest
对象,而不保留上载的文件数组(ServerRequest
对象在构造函数中没有作为参数的uploadedFiles
)。这就是为什么您丢失了上载的文件
数组
更新:
我创建了一个和一个来修复它。谢谢。我已经离开几天了,刚才正要开始讨论一个问题。我同意这看起来是Guzzle的PSR7库的一个bug,尽管我担心我用错了它。我会把这个标记为公认的答案,你绝对应该得到赏金。
...
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()
);
}
...