【问题标题】:Yii URLpath Customization for REST APIYii URLpath 自定义 REST API
【发布时间】:2015-02-09 12:16:05
【问题描述】:

我正在开发 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'),

它没有按预期工作,要访问代码,我必须提供以下格式的 URL

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

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

如果我使用以下 URL,(我想使用)

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

它返回 $_GET 值作为 NULL 或有时作为 array($USERID =&gt; NULL);

请告诉我相同的解决方案。

【问题讨论】:

  • 看起来很奇怪,我在一个正在运行的项目中有一个非常相似的方法。现在我正在尝试将其添加到具有相同规则的另一个项目中,并且看起来它不起作用。
  • @AlexandruTrandafirCatalin 似乎新版本的 YII (1.x) 有一些问题。好吧,如果您找到任何解决方案,请更新我。
  • 好的,我稍后会研究它,它确实存在使其工作的方法。

标签: php rest url yii


【解决方案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 设置为“路径”,否则规则将无法按预期工作,因为您不会将参数作为查询字符串传递。

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

/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;
    }
}

【讨论】:

  • 感谢您的回复 Alexandru,我会尝试此解决方案,如果可行,我会通知您。
【解决方案2】:

这就是我们让它工作的方式:

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

【讨论】:

    猜你喜欢
    • 2014-05-06
    • 2021-10-31
    • 2017-09-23
    • 2018-11-08
    • 2020-09-22
    • 2017-10-29
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多