如何将短路径映射到 Slim 3 中的同一控制器

How to map shorthanded routes to the same controller in Slim 3

我正在使用 Slim 3 开发一个 REST API 项目,我想知道是否有一种简单的方法可以实现以下路由而无需为 shorthand 创建单独的路由。

对于 ../users/{id},shorthand 是 ../me,其中 id 是当前用户 ID。 到目前为止很简单,我只是创建了两条路线,并将它们映射到相同的控制器方法;但是还有更多端点使用相同的逻辑,例如: ../users/{id}/posts 应使用与 ../me/posts 相同的方法, ../users/{id}/groups/{gid} 应使用 as ../me/groups/{gid},等等

我用双点表示前面有 URI 部分(版本、语言等)。 我希望你现在明白了。

所以我的问题是:有没有一种方法可以重新路由这些类型的请求,或者是否有一种路由模式可以满足我的需求,但我错过了,甚至我可能不得不 fiddle实现此目的的中间件?

谢谢

试一试

$app->get('/users[/{id}/groups[/{msgid}]]', function ($request, $response, $args) {
}

并查看http://www.slimframework.com/docs/objects/router.html

中的官方文档

有一种方法可以利用 Slim 的 FastRoute 路由器。将正则表达式放入路由的变量部分,并在控制器内进行额外的解析:

$app->get('/whatever/{id:users/\d+|me}', function ($request, $response, $args) {
    if (preg_match('%^users/(\d+)$%', $args['id'], $parsed)) {
        // This is /users/{id} route:
        $user = $parsed[1];
    } else {
        // This is /me route:
        $user = 'automagically recognized user';
    }
    return $response->withStatus(200)->write('Hello '.$user);
});

不过,我会觉得这很奇怪,并建议将同一个控制器映射到两条单独的路线,就像您现在所做的那样。我想到两个原因:

  • 您可以将 'me' 路由的用户 ID 查找仅放入需要的路由中(通过让另一个控制器在主控制器之上添加此逻辑)。
  • 团队中的其他开发人员更容易理解。

希望对您有所帮助!