Php 更改Slim请求属性

Php 更改Slim请求属性,php,slim,psr-7,Php,Slim,Psr 7,如何更改Slim请求的URI路径?但是,我尝试了以下操作,withPath()克隆uri,因此请求对象不会更改。如果不可能,是否有一个简单的过程来基于原始请求但基于新的URI路径创建新的Slim请求 关于我为什么希望这样做的背景。我有一个方法,它接受Slim请求,使用Guzzle向另一台服务器执行cURL请求,写入Slim响应,然后返回Slim响应。Guzzle查询几乎相同路径但有版本号的API $app->get('/{basetype:guids|tester}/{guid}/logs

如何更改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;
    }
}

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

<?php

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

谢谢Matias,啊,我看到您刚刚使用withUri方法创建了一个新的请求对象。没有测试过,但对我有效。是的,我看到它们是不变的。只是好奇,为什么是设计的?请注意,我需要这样做,但是如果我想要一个不同的路径和端口,我会只克隆对象两次吗?这实际上是一个好问题。我认为PHP-FIG和PHP开发人员一般都采用了一些良好的功能实践和概念。不变性就是其中之一。我怀疑这在本例中会带来一些好处,但我猜它是这样做的,因为请求和响应最终会被传递到一个相当大的中间件堆栈中。在任何情况下,psr提供了一个更好的解释,我可以给你一个更好的解释。是的,你可以毫无问题地改变请求对象中的任何东西。但是,如果您将其传递给中间件堆栈,它们将处理更改的请求。如果您想在请求中存储元数据,那么
withAttribute
方法就是您的朋友。