Yii2 - 嵌套资源最佳实践



使用 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

还有基于该原则构建的扩展,还提供相关的帮助程序操作。

最新更新