Yii2 — лучшие практики вложенных ресурсов

Используя фреймворк 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 класс, который может иметь дело с вложенными маршрутами? (может, кто-то это уже реализовал?)

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

4

Решение

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

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

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

В обоих случаях вы можете получить доступ к article_id (в GET) в действиях create или index. Вы можете сделать то же самое, если хотите добавить действия в статью.

5

Другие решения

Для большей вселенной:

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

В случае, если это связано со встроенным 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

Существует также это расширение построен на основе этого принципа, а также обеспечивает соответствующие вспомогательные действия.

0
По вопросам рекламы [email protected]