用于RESTful API的YII URLManager

时间:2012-03-11 03:11:01

标签: yii url-routing

尝试使用yii(使用yii的第一个项目)处理RESTfull API

让URLManager正确路由呼叫时遇到问题:

    'urlManager' => array(
        'urlFormat' => 'path',
        'showScriptName' => false,
        'caseSensitive' => false,
        'rules' => array(
          'api/<controller>' => array('api/<controller>/list', 'verb' => 'GET'),
          'api/<controller>' => array('api/<controller>/create', 'verb' => 'POST'),
        ),
    ),

尝试使用它(这不是完整的片段,我有PUT / DELETE等的调度员。 但是它不起作用......在绝望中,我甚至尝试了一些简单的事情:

    'urlManager' => array(
        'urlFormat' => 'path',
        'showScriptName' => false,
        'caseSensitive' => false,
        'rules' => array(
            'tezt' => array('landing/beta', 'verb' => 'GET'),
            'tezt' => array('landing', 'verb' => 'POST'),
        ),
    ),

每当我删除其中一条规则时,它都有效,但是当我把两条规则都放进去时,它们都不起作用,我得到了例外     exception.CHttpException.404

 exception 'CHttpException' with message 'Unable to resolve the request
 "tezt".' in /yii-1.1.10/web/CWebApplication.php:280

现在再次敲打我的脑袋2天了。可能在Web上看到了关于URLManager的所有示例和教程(虽然找不到对规则的直接和完整的解释)。但是,没有快乐。

我做错了吗?这是我的盒子设置吗?

3 个答案:

答案 0 :(得分:6)

我试过这个并且有效:

'rules'=>array(
            //API URLs
            array('api/<controller>/index', 'pattern'=>'api/<controller:\w+>', 'verb'=>'GET'),
            array('api/<controller>/create', 'pattern'=>'api/<controller:\w+>', 'verb'=>'POST'),
            array('api/<controller>/view', 'pattern'=>'api/<controller:\w+>/<id:\d+>', 'verb'=>'GET'),
            array('api/<controller>/update', 'pattern'=>'api/<controller:\w+>/<id:\d+>', 'verb'=>'PUT, POST'),
            array('api/<controller>/delete', 'pattern'=>'api/<controller:\w+>/<id:\d+>', 'verb'=>'DELETE'),
            //Other URLs
            '<controller:\w+>/<id:\d+>'=>'<controller>/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
            '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
        ),

“api”是modules部分中配置为

的模块
'api'=>array('defaultController' => 'default',),

在REST客户端中,您必须指定控制器名称,即使对于默认控制器也是如此。

我正在使用Yii 1.1.10,但我认为Yii支持自1.1.7以来的RESTful URL。

答案 1 :(得分:0)

试试这个

'api/<controller:\w+>' => array('api/<controller>/list', 'verb' => 'GET'),  

是api模块吗?

答案 2 :(得分:0)

对于其他任何偶然发现错误的人来说,它不起作用,因为规则是使用相同的密钥声明的,所以后一条规则覆盖了前者。

将来,在规则配置数组中声明模式:

array(
    'route',
    'pattern' =>'somePattern',
    'verb' =>'...',
),
array(
    'another/route',
    'pattern' =>'anotherPattern',
    'verb' =>'...',
),