使用Yii2框架我找不到任何内置功能来在Ruby on Rails中实现名为nested resources
的东西(http://guides.rubyonrails.org/routing.html#nested-resources)
例如,文章有很多评论。因此,我希望在使用/articles/1/comments
操作时,可以通过index
网址访问与文章相关的评论;使用/articles/1/comments/create
操作时通过create
等等......
我是否必须向名为actionIndexComments(), actionCreateComment()...
的 ArticlesController 添加多个操作方法?
或者我应该通过GET传递?article_id=1
参数并将其用于 CommentsController 中的过滤?
或者我应该实现可以处理嵌套路由的自定义UrlManager
类? (也许有人已经实现了它?)
目前最佳做法是什么?
答案 0 :(得分:5)
您应该可以使用UrlManager轻松完成此操作。它还取决于您想要实际操作的位置。您可以将它们放在文章控制器或注释控制器
中例如,对于评论控制器,您可以定义如下规则:
'article/<article_id:\d+>/comments/create/' => 'comment/create',
'article/<article_id:\d+>/comments/' => 'comment/index',
在这两种情况下,您都可以在create或index操作中访问article_id(在GET中)。如果你想把动作放在文章中,你可以做同样的事情。
答案 1 :(得分:4)
更多宇宙:
'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',
答案 2 :(得分:0)
如果它与内置REST Api相关并且您使用的是yii\rest\UrlRule而不是yii\web\UrlRule,则其$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也建立在该原则之上,并提供相关的帮助行动。