【问题标题】:Yii2 - nested resources best practiceYii2 - 嵌套资源最佳实践
【发布时间】:2023-03-23 15:55:02
【问题描述】:

使用 Yii2 框架我找不到任何内置功能来在 Ruby on Rails (http://guides.rubyonrails.org/routing.html#nested-resources) 中实现名为 nested resources 的东西

例如,文章有很多评论。所以我希望在使用index 操作时,通过/articles/1/comments URL 访问与文章相关的cmets;使用create 操作时通过/articles/1/comments/create 等等...

我是否必须向 ArticlesController 添加多个名为 actionIndexComments(), actionCreateComment()... 的操作方法?

或者我应该通过 GET 传递一个 ?article_id=1 参数并将其用于 CommentsController 中的过滤?

或者我应该实现可以处理嵌套路由的自定义UrlManager 类吗? (也许有人已经实现了?)

目前最好的做法是什么?

【问题讨论】:

  • 我认为最好有多个动作

标签: php yii2 nested-resources


【解决方案1】:

您应该可以使用 UrlManager 轻松完成此操作。它还取决于您要将实际操作放在哪里。您可以将它们放在文章控制器或评论控制器中

例如,对于 cmets 控制器,您可以定义如下规则:

'article/<article_id:\d+>/comments/create/' => 'comment/create',
'article/<article_id:\d+>/comments/' => 'comment/index',

在这两种情况下,您都可以在创建或索引操作中访问 article_id(在 GET 中)。如果您想将操作放入文章中,您可以执行完全相同的操作。

【讨论】:

  • 你能帮我吗,我是 yii 的新手,我应该在哪里定义这些规则?我有teamsplayes,我希望我的网址像teams/1/player/create,其中1 是team_id
【解决方案2】:

更多宇宙:

'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',

【讨论】:

    【解决方案3】:

    如果它与内置 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建立在这个原则之上,也提供了相关的辅助动作。

    【讨论】:

    • 终于解决了!缺少的重要技巧是:'controller' => ['players' => 'v1/player', 'trophies' => 'v1/trophy']。
    猜你喜欢
    • 2014-01-23
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    相关资源
    最近更新 更多