1

我有一个基于 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'),

我该怎么做?

4

2 回答 2

4

如果您想使用一个控制器,您可以像以前一样保留规则:

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 规则功能

  • 在“parseUrl”方法中,您检查 url 是否与您的规则匹配(有 api/version/model/id)以及是否匹配取决于您重定向到正确控制器的 api 版本(例如:apiV2/view)

代码:

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
    }
于 2012-10-19T09:56:39.047 回答
1

将整个 API 放入一个模块中,将版本放入子模块中,并将它们包含在主模块配置中:

/api    -> modules.ApiModule
/api/v1 -> modules.ApiModule.modules.V1Module
/api/v2 -> modules.ApiModule.modules.V2Module

... ETC...

我认为默认 Yii 路由器的路径版本自动支持这种模式,但我可能错了。在任何情况下,将版本组织成模块可以让它们轻松共享代码,同时仍然保持不同,并使错误呈现给用户自然。

于 2013-05-29T22:00:51.900 回答