1

如何更改 Slim 请求的 URI 路径?但是,我尝试了以下操作,withPath()克隆了 uri,因此请求对象没有更改。如果不可能,是否有基于原始请求但新的 URI 路径创建新 Slim 请求的简单过程?

关于我为什么要这样做的背景。我有一个接受 Slim 请求的方法,使用 Guzzle 向另一台服务器执行 cURL 请求,写入 Slim 响应,并返回 Slim 响应。Guzzle 查询几乎相同路径但带有版本号的 API。

$app->get('/{basetype:guids|tester}/{guid}/logs/{id:[0-9]+}', function (Request $request, Response $response, $args) {
    switch($request->getQueryParam('ContentType')) {
        case 'text':
            //
            return $this->view->render($response, 'log.html', $rs);
        case 'file':
            $uri=$request->getUri();
            $path=$uri->getPath();
            $uri->withPath(_VER_.$path);
            return $this->serverBridge->proxy($request, $response, 'application/octet-stream');
    }
});

class ServerBridge
{
    protected $httpClient;

    public function __construct(\GuzzleHttp\Client $httpClient)
    {
        $this->httpClient=$httpClient;
    }

    public function proxy(\Slim\Http\Request $slimRequest, \Slim\Http\Response $slimResponse):\Slim\Http\Response {
        //$slimRequest is used to obtain data to send to Guzzle 
        $curlResponse = $this->httpClient->request($method, $path, $options);
        //use $curlResponse to get data and write to $slimResponse
        return $slimResponse;
    }
}
4

1 回答 1

2

如果更改 Uri 路径,则还必须更改请求。这是设计使然。别担心,克隆在 PHP 中很便宜。

<?php

$request = $request->withUri($request->getUri()->withPath('your/changed/path'));

注意:请小心$request在中间件堆栈的其他一些调用中使用该 new 。它们之所以不可变是有原因的。在执行早期更改请求的 uri 可能会产生不良的副作用。

于 2018-12-26T19:44:36.103 回答