【问题标题】:How to map shorthanded routes to the same controller in Slim 3如何在 Slim 3 中将简写路由映射到同一个控制器
【发布时间】:2016-10-13 21:36:51
【问题描述】:

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

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

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

所以我的问题是:有没有办法重新路由这些请求,或者是否有适合我需要的路由模式但我错过了它,甚至我必须摆弄一个中间件来实现这一点?

谢谢

【问题讨论】:

  • 如何将 id 放入会话中,然后当您将我作为变量点击时将其取出?
  • REST 不是这样工作的
  • 啊,是的,抱歉解决了路线问题。这就是我在会议期间闲逛所得到的。

标签: php rest routing url-routing slim


【解决方案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 查找仅放入需要它的路径(通过让另一个控制器在主控制器之上添加此逻辑)。
  • 团队中的其他开发人员更容易理解。

希望对你有帮助!

【讨论】:

    【解决方案2】:

    试试看

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

    并查看http://www.slimframework.com/docs/objects/router.html中的官方文档

    【讨论】:

    • 我无法想象这也适用于“/me/groups/{msgid}”
    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多