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 建立在该原则之上,还提供了相关的辅助操作。