用于REST API的Yii URLpath自定义

时间:2015-02-09 12:16:06

标签: php rest url yii

我正在开发YII(1.x)REST API。我想按照以下格式更新网址

 GET api/user =>  Should return list of User
 GET api/user/$id =>  Should return one USER with provided ID
 DELETE api/user/$id =>  Should delete respective user

我在主配置文件中添加了以下代码

array('api/list', 'pattern' => 'api/<model:\w+>', 'verb' => 'GET'), 
array('api/view', 'pattern' => 'api/<model:\w+>/<id:\d+>', 'verb' => 'GET'),
array('api/update', 'pattern' => 'api/<model:\w+>/<id:\d+>', 'verb' => 'PUT'),
array('api/delete', 'pattern' => 'api/<model:\w+>/<id:\d+>', 'verb' => 'DELETE'),

无法按预期工作,访问代码我必须以下列格式提供网址

http://myServer/index.php/api/user/view/model/user/id/$USERID

以上网址返回$_GETarray("id"=>$USERID);

如果我使用以下网址(我想使用)

http://myServer/index.php/api/user/$USERID

它将$_GET值返回NULL或有时返回array($USERID => NULL);

请让我知道相同的解决方案。

2 个答案:

答案 0 :(得分:1)

我已经使用Yii 1.1.10和1.1.14测试了你的规则,它确实适用于两个版本。

这是用于urlManager的配置:

'urlManager'=>array(
    'urlFormat' => 'path',
    'showScriptName'=>true,
    'rules'=>array(
        array('api/list', 'pattern' => 'api/<model:\w+>', 'verb' => 'GET'), 
        array('api/view', 'pattern' => 'api/<model:\w+>/<id:\d+>', 'verb' => 'GET'),
        array('api/update', 'pattern' => 'api/<model:\w+>/<id:\d+>', 'verb' => 'PUT'),
        array('api/delete', 'pattern' => 'api/<model:\w+>/<id:\d+>', 'verb' => 'DELETE'),
    ),
)

您可以看到我必须将urlFormat设置为'path',否则规则将无法按预期工作,因为您不会将参数作为查询字符串传递。

并使用以下网址进行测试:

/index.php/api/User
/index.php/api/User/123

通过指向列表和查看操作,它们可以正常工作。

最后一点:

您还应该检查您是否使用了可以修改配置文件中原始规则的CUrlManager扩展名。

在另一个项目中,我使用的是MLUrlManager扩展,它在每个规则前添加了前缀。如果您使用它,则应根据规则是字符串还是数组来调整代码以对其进行不同的处理。

示例:

$newRules = array();
foreach ($this->rules as $reg => $rule) {          
    if ($reg === 'robots.txt') {
      $newRules[$reg] = $rule;
    } elseif (is_string($rule)) {
      $newRules['<language:'.$langReg.'>/'.$reg] = $rule;
    } elseif (is_array($rule)) { // special handling for rules defined as array
      $rule['pattern']='<language:'.$langReg.'>/'.$rule['pattern'];
      $newRules[$reg] = $rule;
    }
}

答案 1 :(得分:0)

这就是我们如何运作:

'api/<controller:\w+>'=>array('<controller>/restList', 'verb'=>'GET'),
                                'api/<controller:\w+>/<id:\w*>'=>array('<controller>/restView', 'verb'=>'GET'),
                                'api/<controller:\w+>/<id:\w*>/<var:\w*>'=>array('<controller>/restView', 'verb'=>'GET'),
                                'api/<controller:\w+>/<id:\w*>/<var:\w*>/<var2:\w*>'=>array('<controller>/restView', 'verb'=>'GET'),

                                array('<controller>/restUpdate', 'pattern'=>'api/<controller:\w+>/<id:\w*>', 'verb'=>'PUT'),
                                array('<controller>/restUpdate', 'pattern'=>'api/<controller:\w+>/<id:\w*>/<var:\w*>', 'verb'=>'PUT'),
                                array('<controller>/restUpdate', 'pattern'=>'api/<controller:\w*>/<id:\w*>/<var:\w*>/<var2:\w*>', 'verb'=>'PUT'),

                                array('<controller>/restDelete', 'pattern'=>'api/<controller:\w+>/<id:\w*>', 'verb'=>'DELETE'),
                                array('<controller>/restDelete', 'pattern'=>'api/<controller:\w+>/<id:\w*>/<var:\w*>', 'verb'=>'DELETE'),
                                array('<controller>/restDelete', 'pattern'=>'api/<controller:\w+>/<id:\w*>/<var:\w*>/<var2:\w*>', 'verb'=>'DELETE'),

                                array('<controller>/restCreate', 'pattern'=>'api/<controller:\w+>', 'verb'=>'POST'),
                                array('<controller>/restCreate', 'pattern'=>'api/<controller:\w+>/<id:\w+>', 'verb'=>'POST'),