升级到 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 如何在内部处理请求和路由的核心概念,希望能得到一些帮助!
编辑:也许应该补充一点,我对内部重定向的意思是客户端不应该知道已经进行了重定向。即,任何向客户端返回某些内容的常规重定向函数在这里都不适用。