php - 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 如何在内部处理请求和路由的核心概念,希望能得到一些帮助!
编辑:也许应该补充一点,我对内部重定向的意思是客户端不应该知道已经进行了重定向。即,任何向客户端返回某些内容的常规重定向函数在这里都不适用。
解决方案
正如@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'));
});
推荐阅读
- python - 导入外部数据
- angular-components - 从组件中移除 ngModel
- django - 怎么配置Nginx,才能提供Django的媒体资源?
- laravel - 无法解析 [Illuminate\Mail\TransportManager] 的 NULL 驱动程序
- html - 我可以通过点击标签提交表单吗?
- python - 如何使用python将带有键值对的抓取的json数据保存为json文件格式
- azure - 配置 TFS Online“Azure 应用服务部署”步骤
- python - 凯撒暴力加密
- python - 按条件在多列上删除行
- html - 基于角度的应用程序的java脚本到打字稿转换