2015-01-06 4 views
4

Использование рамки Yii2 я не могу найти никаких встроенных функциональных возможностей реализовать то, что называется nested resources в Ruby On Rails (http://guides.rubyonrails.org/routing.html#nested-resources)Yii2 - вложенные ресурсы наилучшей практики

Например, Статья имеет много Комментарии. Поэтому я хочу, чтобы комментарии, связанные с статьей, были доступны через /articles/1/comments URL, когда используется действие index; через /articles/1/comments/create когда create действие используется и так далее ...

Должен ли я добавить несколько действий-методов ArticlesController называется actionIndexComments(), actionCreateComment()...?

Или должен передать параметр ?article_id=1 через GET и использовать его для фильтрации в КомментарииКонтроллер?

Или должен ли я реализовать собственный класс UrlManager, который может обрабатывать вложенные маршруты? (возможно, кто-то уже его реализовал?)

Какова оптимальная практика на данный момент?

+0

Я думаю, что лучше иметь несколько действий – Justinas

ответ

5

Вы должны быть в состоянии сделать это легко с помощью UrlManager. Это также зависит от того, где вы хотите поместить фактические действия. Вы можете поместить их либо в статье контроллера или комментарий контроллера

Например, для контроллера комментариев вы можете определить правила, как это:

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

В обоих случаях вы можете получить доступ к article_id (в ГЭТ) в создавать или индексировать действия. Вы можете сделать то же самое, если хотите внести действия в статью.

+0

Можете ли вы мне помочь, им новые в yii, где я должен определять эти правила? у меня есть 'команды' и' playes', и я хочу, чтобы мой url был как 'команды/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 Апи, и вы используете 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, построенный поверх этого принципа, а также обеспечивает соответствующие вспомогательные действия.

 Смежные вопросы

  • Нет связанных вопросов^_^