【问题标题】:Slim 4 internal redirect, infinity loopSlim 4 内部重定向,无限循环
【发布时间】: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 自己的实现

标签: php slim slim-4


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2012-06-08
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多