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'));
});
升级到 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'));
});