如何将缺少路线映射到Slim 3中的同一个控制器

时间:2016-06-13 12:46:43

标签: php rest routing url-routing slim

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

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

我使用双点表示存在前面的URI部分(版本,语言等)。 我希望你现在能得到这个想法。

所以我的问题是这样的:有没有办法重新路由这些请求,或者是否有一种符合我需求的路由模式,我错过了它,甚至我不得不在中间件中捣乱才能实现这一目标?

由于

2 个答案:

答案 0 :(得分:1)

有一种方法可以利用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);
});

但是,我发现这很奇怪,并建议将同一个控制器映射到两条单独的路径,就像现在一样。我想到了两个原因:

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

希望它有所帮助!

答案 1 :(得分:0)

试试吧

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

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

中的官方文档