Используя фреймворк Yii2, я не могу найти встроенную функциональность для реализации того, что называется nested resources
в Ruby on Rails (http://guides.rubyonrails.org/routing.html#nested-resources)
Например, Статья имеет много Комментарии. Поэтому я хочу, чтобы комментарии, связанные со статьей, были доступны через /articles/1/comments
URL когда index
действие используется; с помощью /articles/1/comments/create
когда create
действие используется и так далее …
Должен ли я добавить несколько action-методов к ArticlesController называется actionIndexComments(), actionCreateComment()...
?
Или я должен передать ?article_id=1
параметр через GET и использовать его для фильтрации в CommentsController ?
Или я должен, возможно, реализовать пользовательские UrlManager
класс, который может иметь дело с вложенными маршрутами? (может, кто-то это уже реализовал?)
Какова лучшая практика на данный момент?
Вы должны быть в состоянии сделать это легко с UrlManager. Это также зависит от того, куда вы хотите поместить реальные действия. Вы можете разместить их либо в контроллере статей, либо в контроллере комментариев
Например, для контроллера комментариев вы можете определить такие правила:
'article/<article_id:\d+>/comments/create/' => 'comment/create',
'article/<article_id:\d+>/comments/' => 'comment/index',
В обоих случаях вы можете получить доступ к article_id (в GET) в действиях create или index. Вы можете сделать то же самое, если хотите добавить действия в статью.
Для большей вселенной:
'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, и вы используете юй \ остальное \ UrlRule вместо юй \ Web \ UrlRule тогда его префикс $ собственность может помочь достичь этого, выполнив:
'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
Существует также это расширение построен на основе этого принципа, а также обеспечивает соответствующие вспомогательные действия.