Yii2 - 嵌套资源最佳实践
Yii2 - nested resources best practice
使用 Yii2 框架,我找不到任何内置功能来实现 Ruby 中的 nested resources
on Rails (http://guides.rubyonrails.org/routing.html#nested-resources)
例如,一篇文章有很多评论。所以我希望当使用 index
操作时,与文章相关的评论将通过 /articles/1/comments
URL 访问;当使用 create
操作时,通过 /articles/1/comments/create
等等...
我是否必须向名为 actionIndexComments(), actionCreateComment()...
的 ArticlesController 添加多个操作方法?
或者我应该通过 GET 传递一个 ?article_id=1
参数并将其用于 CommentsController 中的过滤吗?
或者我是否应该实现可以处理嵌套路由的自定义 UrlManager
class? (也许有人已经实现了?)
目前最佳做法是什么?
您应该能够使用 UrlManager 轻松完成此操作。它还取决于您想将实际操作放在哪里。您可以将它们放在文章控制器或评论控制器中
例如,对于评论控制器,您可以定义如下规则:
'article/<article_id:\d+>/comments/create/' => 'comment/create',
'article/<article_id:\d+>/comments/' => 'comment/index',
在这两种情况下,您都可以在创建或索引操作中访问 article_id(在 GET 中)。如果你想把动作放在文章中,你可以做同样的事情。
更多宇宙:
'GET,HEAD v1/articles/<id:\d+>/comments' =>
'v1/articles/comment/index',
'GET,HEAD v1/<article/<id:\d+>/comments/<id:\d+>' =>
'v1/articles/comment/view',
'POST v1/articles/<id:\d+>/comments' =>
'v1/articles/comment/create',
'PUT,PATCH v1/article/<id:\d+>/comments' =>
'v1/articles/comment/update',
'DELETE v1/article/<id:\d+>/comments' =>
'v1/articles/comment/delete',
如果它与内置 REST Api 相关并且您正在使用 yii\rest\UrlRule instead of yii\web\UrlRule then its $prefix 属性 可以通过以下方式帮助实现:
'rules' => [
[
'class' => 'yii\rest\UrlRule',
'controller' => ['players' => 'v1/player', 'trophies' => 'v1/trophy'],
'prefix' => 'teams/<team_id:\d+>',
],
],
这将为以下端点生成所需的规则:
/teams/1/players
/teams/1/players/2
/teams/1/trophies
/teams/1/trophies/4
还有这个 extension 建立在该原则之上,还提供了相关的辅助操作。
使用 Yii2 框架,我找不到任何内置功能来实现 Ruby 中的 nested resources
on Rails (http://guides.rubyonrails.org/routing.html#nested-resources)
例如,一篇文章有很多评论。所以我希望当使用 index
操作时,与文章相关的评论将通过 /articles/1/comments
URL 访问;当使用 create
操作时,通过 /articles/1/comments/create
等等...
我是否必须向名为 actionIndexComments(), actionCreateComment()...
的 ArticlesController 添加多个操作方法?
或者我应该通过 GET 传递一个 ?article_id=1
参数并将其用于 CommentsController 中的过滤吗?
或者我是否应该实现可以处理嵌套路由的自定义 UrlManager
class? (也许有人已经实现了?)
目前最佳做法是什么?
您应该能够使用 UrlManager 轻松完成此操作。它还取决于您想将实际操作放在哪里。您可以将它们放在文章控制器或评论控制器中
例如,对于评论控制器,您可以定义如下规则:
'article/<article_id:\d+>/comments/create/' => 'comment/create',
'article/<article_id:\d+>/comments/' => 'comment/index',
在这两种情况下,您都可以在创建或索引操作中访问 article_id(在 GET 中)。如果你想把动作放在文章中,你可以做同样的事情。
更多宇宙:
'GET,HEAD v1/articles/<id:\d+>/comments' =>
'v1/articles/comment/index',
'GET,HEAD v1/<article/<id:\d+>/comments/<id:\d+>' =>
'v1/articles/comment/view',
'POST v1/articles/<id:\d+>/comments' =>
'v1/articles/comment/create',
'PUT,PATCH v1/article/<id:\d+>/comments' =>
'v1/articles/comment/update',
'DELETE v1/article/<id:\d+>/comments' =>
'v1/articles/comment/delete',
如果它与内置 REST Api 相关并且您正在使用 yii\rest\UrlRule instead of yii\web\UrlRule then its $prefix 属性 可以通过以下方式帮助实现:
'rules' => [
[
'class' => 'yii\rest\UrlRule',
'controller' => ['players' => 'v1/player', 'trophies' => 'v1/trophy'],
'prefix' => 'teams/<team_id:\d+>',
],
],
这将为以下端点生成所需的规则:
/teams/1/players
/teams/1/players/2
/teams/1/trophies
/teams/1/trophies/4
还有这个 extension 建立在该原则之上,还提供了相关的辅助操作。