Slim 4 内部重定向,无限循环

Slim 4 internal redirect, infinity loop

升级到 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。任何向客户端返回内容的常规重定向函数均不适用于此处。

如@remy 所述,使用实现 ServerRequestFactoryInterface 的 ServerRequestFactory。

对于slim/psr7是:Slim\Psr7\Factory\ServerRequestFactory

静默重定向到另一条路由就这么简单:

use Slim\Psr7\Factory\ServerRequestFactory;
...
...
$app->get('/foo', function ($request, $response, $args)
{
    global $app;
    return $app
        ->handle((new ServerRequestFactory())->createServerRequest('GET', '/bar'));
});