Yii2 - 嵌套资源的最佳实践

时间:2015-01-06 11:51:51

标签: php yii2 nested-resources

使用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类? (也许有人已经实现了它?)

目前最佳做法是什么?

3 个答案:

答案 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也建立在该原则之上,并提供相关的帮助行动。

相关问题