使用 Yii2 框架,我找不到任何内置功能来实现 Ruby on Rails (http://guides.rubyonrails.org/routing.html#nested-resources) 中称为 nested resources
的东西
例如,一篇文章有很多评论。因此,我希望在使用index
操作时,可以通过/articles/1/comments
URL访问与文章相关的评论;通过/articles/1/comments/create
何时使用create
动作等等...
我是否必须将多个操作方法添加到名为actionIndexComments(), actionCreateComment()...
的文章控制器?
还是我应该通过 GET 传递一个?article_id=1
参数并使用它来在 CommentsController 中进行过滤?
或者我应该实现可以处理嵌套路由的自定义UrlManager
类?(也许有人已经实现了它?
目前的最佳实践是什么?
您应该能够使用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 而不是 yii\web\UrlRule,那么它的 $prefix 属性可以通过执行以下操作来帮助实现这一目标:
'rules' => [
[
'class' => 'yiirestUrlRule',
'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
还有基于该原则构建的扩展,还提供相关的帮助程序操作。