Yii2 路由使用 yii\rest\UrlRule 和几个参数
Yii2 route using yii\rest\UrlRule with several parameters
我正在尝试为 REST 使用 Yii 2 路由 API。
按照 http://www.yiiframework.com/doc-2.0/guide-rest-routing.html 的教程,我已经(成功地)为 API 入口点定义了很多规则,如下所示:
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
[
'class' => 'yii\rest\UrlRule',
'controller' => 'user'
],
],
]
这样的规则定义:
- GET /users(列出用户)
- GET /users/123(显示用户 123 的详细信息)
现在,我的用户有游戏了。所以我想要 urls :
- GET /users/123/games(列出用户123的游戏)
- GET /users/123/games/864(用户 123 的游戏 864 的详细信息 - 例如他的分数)
我尝试像这样定义我的新入口点(但没有成功):
'rules' => [
... previous rules ...,
[
'class' => 'yii\rest\UrlRule',
'controller' => [
'game'
],
'tokens' => [
'{userid}' => '<userid:\d>',
'{gameid}' => '<gameid:\d>',
],
'patterns' => [
'GET,HEAD /users/{userid}/games' => 'index',
'GET,HEAD /users/{userid}/games/{gameid}' => 'view',
]
]
]
这个定义似乎是错误的,因为我收到 404 页面未找到错误。
我应该如何定义新的 url 路线?
我想为我的定义使用等效格式,扩展 'yii\rest\UrlRule'
我不确定这是否可行,教程没有提到这种情况。
所以我想出了如何使用更复杂的规则。
先解决,再解释。
解决方法如下:
'rules' => [
... previous rules ...,
[
'class' => 'yii\rest\UrlRule',
'controller' => 'game',
'prefix' => '/users/<userid:\d+>',
'tokens' => [
'{gameid}' => '<gameid:\d+>',
],
'patterns' => [
'GET,HEAD' => 'index',
'GET,HEAD {gameid}' => 'view',
]
]
]
现在解释:
- 首先,我的 userid / gameid 属性定义错误。 “\d”后少了一个“+”
- 控制器似乎作为前缀自动添加到模式中。所以你必须同时定义一个控制器和一个前缀(将在控制器之前添加)。
- 前缀中的参数似乎没有被解析以找到标记。所以我直接在前缀中写了正则表达式,而不是添加 "userid" 作为标记。
- 最后,在 "prefix/controller/pattern" 的连接过程中会自动添加各种“/”,因此您不必编写一个。
别忘了复数规则! "game" 是单数”,但有效的网址将是
- /users/123/games
- /users/123/games/789
希望对您有所帮助。
我认为有一个简单的解决方案,请试试这个:
'rules' => [
...
'/users/<userId:\d+>/games' => 'game/index' ,
'/users/<userId:\d+>/games/<gameId:\d+>' => 'game/view' ,
....
];
只需使用yii2-nested-rest
它为 Yii2 框架中的多对多关系提供 REST API。
希望评论能让魔术更容易理解:
'rules' => [
// this usual rule for base Yii2 rest usage
['class' => 'yii\rest\UrlRule', 'controller' => ['sitecomponent' ,'sitepage' , 'sitedomain'], 'pluralize'=>false
],
// then rules for yii2-nested-rest
[
// url sitepage/NNN/sitecomponent[/MMM]
// ^^^^^^^^^ ^^^^^^^^^^^^
// resourceName model-endpoint
'class' => 'tunecino\nestedrest\UrlRule',
'modelClass' => 'app\models\SitePage',
'resourceName' => 'sitepage',
'relations' => ['components' => ['sitecomponent'=>'sitecomponent'] ],
// ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^^
// relation name url-endpoint controller]
// defined in model SitePage model-endpoint with Actions from nested
],
[
// cross url sitecomponent/NNN/sitepage[/MMM]
'class' => 'tunecino\nestedrest\UrlRule',
'modelClass' => 'app\models\SiteComponent',
'resourceName' => 'sitecomponent',
'relations' => ['pages' => ['sitepage' => 'sitepage'] ],
// ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^ ^^^^^^^^^
// relation name url-endpoint controller
// from model SiteComponent model-endpoint with Actions from nested
],
],
GET xx.com/v2/publication/12/p/34
[
'class' => 'yii\rest\UrlRule',
'pluralize' => false,//controller是否复数
'controller' => 'v2/publication',//此处一定要加上v2
'tokens' => [
'{id}' => '<id:\d[\d,]*>',
'{phase}' => '<phase:\d[\d,]*>',
],
// 通过extraPatterns和tokens来实现多个参数传递
'extraPatterns' => [
'GET,HEAD {id}/p/{phase}' => 'phase',
],
],
进行中
public function actionPhase($id, $phase){}
我正在尝试为 REST 使用 Yii 2 路由 API。
按照 http://www.yiiframework.com/doc-2.0/guide-rest-routing.html 的教程,我已经(成功地)为 API 入口点定义了很多规则,如下所示:
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
[
'class' => 'yii\rest\UrlRule',
'controller' => 'user'
],
],
]
这样的规则定义:
- GET /users(列出用户)
- GET /users/123(显示用户 123 的详细信息)
现在,我的用户有游戏了。所以我想要 urls :
- GET /users/123/games(列出用户123的游戏)
- GET /users/123/games/864(用户 123 的游戏 864 的详细信息 - 例如他的分数)
我尝试像这样定义我的新入口点(但没有成功):
'rules' => [
... previous rules ...,
[
'class' => 'yii\rest\UrlRule',
'controller' => [
'game'
],
'tokens' => [
'{userid}' => '<userid:\d>',
'{gameid}' => '<gameid:\d>',
],
'patterns' => [
'GET,HEAD /users/{userid}/games' => 'index',
'GET,HEAD /users/{userid}/games/{gameid}' => 'view',
]
]
]
这个定义似乎是错误的,因为我收到 404 页面未找到错误。 我应该如何定义新的 url 路线? 我想为我的定义使用等效格式,扩展 'yii\rest\UrlRule'
我不确定这是否可行,教程没有提到这种情况。
所以我想出了如何使用更复杂的规则。
先解决,再解释。
解决方法如下:
'rules' => [
... previous rules ...,
[
'class' => 'yii\rest\UrlRule',
'controller' => 'game',
'prefix' => '/users/<userid:\d+>',
'tokens' => [
'{gameid}' => '<gameid:\d+>',
],
'patterns' => [
'GET,HEAD' => 'index',
'GET,HEAD {gameid}' => 'view',
]
]
]
现在解释:
- 首先,我的 userid / gameid 属性定义错误。 “\d”后少了一个“+”
- 控制器似乎作为前缀自动添加到模式中。所以你必须同时定义一个控制器和一个前缀(将在控制器之前添加)。
- 前缀中的参数似乎没有被解析以找到标记。所以我直接在前缀中写了正则表达式,而不是添加 "userid" 作为标记。
- 最后,在 "prefix/controller/pattern" 的连接过程中会自动添加各种“/”,因此您不必编写一个。
别忘了复数规则! "game" 是单数”,但有效的网址将是
- /users/123/games
- /users/123/games/789
希望对您有所帮助。
我认为有一个简单的解决方案,请试试这个:
'rules' => [
...
'/users/<userId:\d+>/games' => 'game/index' ,
'/users/<userId:\d+>/games/<gameId:\d+>' => 'game/view' ,
....
];
只需使用yii2-nested-rest
它为 Yii2 框架中的多对多关系提供 REST API。
希望评论能让魔术更容易理解:
'rules' => [
// this usual rule for base Yii2 rest usage
['class' => 'yii\rest\UrlRule', 'controller' => ['sitecomponent' ,'sitepage' , 'sitedomain'], 'pluralize'=>false
],
// then rules for yii2-nested-rest
[
// url sitepage/NNN/sitecomponent[/MMM]
// ^^^^^^^^^ ^^^^^^^^^^^^
// resourceName model-endpoint
'class' => 'tunecino\nestedrest\UrlRule',
'modelClass' => 'app\models\SitePage',
'resourceName' => 'sitepage',
'relations' => ['components' => ['sitecomponent'=>'sitecomponent'] ],
// ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^^
// relation name url-endpoint controller]
// defined in model SitePage model-endpoint with Actions from nested
],
[
// cross url sitecomponent/NNN/sitepage[/MMM]
'class' => 'tunecino\nestedrest\UrlRule',
'modelClass' => 'app\models\SiteComponent',
'resourceName' => 'sitecomponent',
'relations' => ['pages' => ['sitepage' => 'sitepage'] ],
// ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^ ^^^^^^^^^
// relation name url-endpoint controller
// from model SiteComponent model-endpoint with Actions from nested
],
],
GET xx.com/v2/publication/12/p/34
[
'class' => 'yii\rest\UrlRule',
'pluralize' => false,//controller是否复数
'controller' => 'v2/publication',//此处一定要加上v2
'tokens' => [
'{id}' => '<id:\d[\d,]*>',
'{phase}' => '<phase:\d[\d,]*>',
],
// 通过extraPatterns和tokens来实现多个参数传递
'extraPatterns' => [
'GET,HEAD {id}/p/{phase}' => 'phase',
],
],
进行中
public function actionPhase($id, $phase){}