PHP Slim-3:如何在内部重定向到另一条路由

问题描述 投票:0回答:2

我有一条类似下面的通用路线-

$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重写。让我们将它们放在一边,并将范围限制为仅使用苗条的框架路由。

php slim slim-3
2个回答
2
投票

我会在单个路由定义中使用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;
});

1
投票

您需要抽象化调用并创建控制器(即您的代码不会那么苗条)。

示例:


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参数更改发生的事情。

© www.soinside.com 2019 - 2024. All rights reserved.