我有一条类似下面的通用路线-
$app->map(['GET', 'POST'], "/", function (\Slim\Http\Request $request, \Slim\Http\Response $response) use ($app) {
// Some random version 1 processing here ...
}
而且我有一个v2版本,如下所示-
$app->map(['GET', 'POST'], "/api/v2", function (\Slim\Http\Request $request, \Slim\Http\Response $response) use ($app) {
// Some random version 2 processing here ...
}
我有一个要解决的问题-
前端总是命中API的v1(通用路由)。我需要根据参数appversion
的值在内部重定向到v2。
我如何在精简框架路由中做到这一点,而不向客户端发出302重定向标头?基本上,我需要在内部重定向到服务器本身。
注:我知道Nginx和Apache重写。让我们将它们放在一边,并将范围限制为仅使用苗条的框架路由。
我会在单个路由定义中使用optional segments进行此操作。
use Psr\Http\Message\{
ServerRequestInterface as Request,
ResponseInterface as Response
};
$app->map(['GET', 'POST'], '/[{v2:api/v2}]', function (Request $request, Response $response, array $args) {
if (isset($args['v2'])) { // You may also check $request->getAttribute('appversion')
// Version 2 processing here...
// return $response;
}
// Version 1 processing here...
// return $response;
});
您需要抽象化调用并创建控制器(即您的代码不会那么苗条)。
示例:
function doV2() {
// ... do V2 things
}
function doV1() {
// ... do V1 things
}
$app->map(['GET', 'POST'], "/", function (\Slim\Http\Request $request, \Slim\Http\Response $response) use ($app) {
if($app->request()->params('appversion') === 'v2') return doV2();
doV1();
}
$app->map(['GET', 'POST'], "/api/v2", function (\Slim\Http\Request $request, \Slim\Http\Response $response) use ($app) {
doV2();
}
之所以不能在内部“重定向”,是因为您的“控制器”是匿名闭包,因此您无法命名/引用/调用它们。相反,如果将它们抽象为函数(是的,可能还需要传入$ request / $ response),那么您就有了可以为适当的路由调用的命名方法。
除了定义闭包或函数之外,您还可以定义控制器并在路由器内使用SlimPHP的Container Resolution-有一个很好的例子in the router docs。
最后,您可以使用中间件来棘手,根据您想要实现的复杂性,根据您的appversion参数更改发生的事情。