首页 > 解决方案 > Slim 4 内部重定向,无限循环

问题描述

升级到 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 如何在内部处理请求和路由的核心概念,希望能得到一些帮助!

编辑:也许应该补充一点,我对内部重定向的意思是客户端不应该知道已经进行了重定向。即,任何向客户端返回某些内容的常规重定向函数在这里都不适用。

标签: phpslimslim-4

解决方案


正如@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'));
});

推荐阅读