2015-01-06 162 views
4

使用Yii2框架我無法找到任何內置的功能來實現on Rails的(http://guides.rubyonrails.org/routing.html#nested-resourcesYii2 - 嵌套資源最佳實踐

例如一些在Ruby中稱爲nested resources,一個文章有許多評論。因此,我希望在使用index動作時,通過/articles/1/comments URL訪問與某篇文章相關的評論;通過/articles/1/comments/create當使用create行動等等...

我一定要多個動作方法添加到ArticlesController稱爲actionIndexComments(), actionCreateComment()...

或者我應該通過一個?article_id=1參數通過GET並用它來過濾CommentsController

或者我應該實現可以處理嵌套路由的自定義UrlManager類? (也許有人已經實現了它?)

現在的最佳實踐是什麼?

+0

我認爲最好有多個動作 – Justinas

回答

5

您應該可以通過UrlManager輕鬆完成此操作。這也取決於你想把實際行動放在哪裏。你可以把它們無論是在文章控制器或評論控制器

例如,對於評論控制器,你可以定義這樣的規則:

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

在這兩種情況下,你可以訪問的article_id(以GET)創建或索引操作。如果你想把這些動作放在文章中,你可以做同樣的事情。

+0

你能幫我嗎,即時消息在yii中,我應該在哪裏實際定義這些規則?我有'隊'和'playes',我希望我的網址像'teams/1/player/create',其中1是'team_id' – heavymetal91

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', 
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基於該原則的基礎上,也提供相關的幫手行動。