如何将短路径映射到 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) {
}
中的官方文档
有一种方法可以利用 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 查找仅放入需要的路由中(通过让另一个控制器在主控制器之上添加此逻辑)。
- 团队中的其他开发人员更容易理解。
希望对您有所帮助!
我正在使用 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) {
}
中的官方文档
有一种方法可以利用 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 查找仅放入需要的路由中(通过让另一个控制器在主控制器之上添加此逻辑)。
- 团队中的其他开发人员更容易理解。
希望对您有所帮助!