我有一个基于 Yii 框架的 REST API: http ://www.yiiframework.com/wiki/175/how-to-create-a-rest-api/
我想在 URL 规则中添加一个 API 版本,例如:
array('api/view', 'pattern'=>'api/<version:\d+>/<model:\w+>/<id:\d+>', 'verb'=>'GET'),
我该怎么做?
我有一个基于 Yii 框架的 REST API: http ://www.yiiframework.com/wiki/175/how-to-create-a-rest-api/
我想在 URL 规则中添加一个 API 版本,例如:
array('api/view', 'pattern'=>'api/<version:\d+>/<model:\w+>/<id:\d+>', 'verb'=>'GET'),
我该怎么做?
如果您想使用一个控制器,您可以像以前一样保留规则:
array('api/view', 'pattern'=>'api/<version:\d+>/<model:\w+>/<id:\d+>', 'verb'=>'GET'),
并在控制器 Action 检查版本:
public function actionView()
{
// Check the version
if($_GET['version'] == 1)
{
//do what you've got to do
}
else if ($_GET['version'] == 2)
{
//do what you've got to do
}
}
另一种解决方案是使用自定义 URL 规则功能
代码:
public function parseUrl($manager,$request,$pathInfo,$rawPathInfo)
{
if (preg_match('%^(api/(\d+))(/(\w+))(/(\d+))$%', $pathInfo, $matches))
{
// $matches[2] is the version and $matches[4] the model
// If it matches we can check the version api and the model
// If it's ok, set $_GET['model'] and/or $_GET['id']
// and return 'apiVx/view'
}
return false; // this rule does not apply
}
将整个 API 放入一个模块中,将版本放入子模块中,并将它们包含在主模块配置中:
/api -> modules.ApiModule
/api/v1 -> modules.ApiModule.modules.V1Module
/api/v2 -> modules.ApiModule.modules.V2Module
... ETC...
我认为默认 Yii 路由器的路径版本自动支持这种模式,但我可能错了。在任何情况下,将版本组织成模块可以让它们轻松共享代码,同时仍然保持不同,并使错误呈现给用户自然。