Php 更改Slim请求属性
如何更改Slim请求的URI路径?但是,我尝试了以下操作,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
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
方法就是您的朋友。