【发布时间】:2021-08-19 04:38:18
【问题描述】:
升级到 Slim v4 后,我尝试用 changelog 中指定的 $app->handle 替换我的简单 $app->subRequest 调用。但是,在更新日志或升级指南中没有关于如何执行此操作的详细信息,我尽最大努力修复它最终会创建一个无限循环:
$app->get("/foo", function (Request $req) use ($app) {
$uri = $req->getUri();
$newUri = $uri->withPath("/bar");
$barReq = $req->withUri($newUri);
// Here we get stuck in endless loop instead of ending up in the /bar route handler below
$app->handle($barReq);
});
$app->get("/bar", function (Request $req) use ($app) {
echo 'bar!';
die;
});
这就像即使 $barReq 是一个具有全新 uri(和路径)的新请求对象,路由器也不会解析应该处理它的路由处理程序,而是再次由同一个处理程序处理。
我之前的简化 (v3) 代码看起来像并且在调用 /foo 时可以很好地获得 /bar 路由的结果:
$app->get("/foo", function (Request $req) use ($app) {
$app->subRequest('GET', '/bar');
});
我可能缺少一些关于 Slim 4 如何在内部处理请求和路由的核心概念,希望能得到一些帮助!
编辑:也许应该补充一点,我对内部重定向的意思是客户端不应该知道已经进行了重定向。 IE。任何向客户端返回内容的常规重定向函数在这里都不适用。
【问题讨论】:
-
您是否尝试过返回响应?例如
return $app->handle($barReq);。die;也有问题,因为它会阻止一切。另外确保你的“bar”路由返回一个响应对象。 -
如果您创建一个新的请求对象而不是现有请求对象的副本并将
$newUri设置到该对象上,它会起作用吗? -
@odan 返回没有任何区别。还有无限循环。 die() 而不是返回的响应对象适用于这里的有限测试 - 无论如何,由于从未调用“/bar”路由处理程序,它永远不会到达。
-
@Remy 不确定,这是我第一次使用 PSR7 请求/响应对象,即使我尝试从以前的请求中复制大部分内容,创建新对象似乎也非常复杂。你有 sn-p 或一些好的文档吗?
-
@AndersGustafsson 取决于您的 PSR7 消息实现,但实现
ServerRequestFactoryInterface::class的类应该允许您创建新的请求对象。 slim factory 例如,如果您使用的是 slim 自己的实现