将请求路由到模块

时间:2011-07-11 20:37:20

标签: php yii url-routing

我正在寻找有关将请求路由到Yii框架中的自定义模块的最佳方法的一些信息。

我正在为一个项目实现一个RestFul Api,并希望有一些方法可以简单地将所有请求路由到api /到其余api所在的模块。更好的方法是将某人如何将api请求路由到自定义UrlManager类,该类在模块中扩展CUrlManager然后处理路由。因此,对mydomain / api / user / model的请求实际上将被延迟并由模块中的UrlManager组件处理,其他请求即mydoamin.com/client/create将由普通的yii应用程序处理。据我所知,这是不可能的!!

所以我会在我的配置中定义一个url管理器类来捕获这样的api路由

class UrlManager extends CUrlManager
{
    protected function processRules()
    {
        if(!isset($_GET['r']))
        {           
            $this->setUrlFormat('path');
            $this->showScriptName=false;
            $this->rules=array(

                //Api Rest Patterns
                array('api/list', 'pattern'=>'^api/user/<model:\w+>', 'verb'=>'GET'),
                array('api/view', 'pattern'=>'^api/user/<model:\w+>/<id:\d+>', 'verb'=>'GET'),
                array('api/update', 'pattern'=>'^api/user/<model:\w+>/<id:\d+>', 'verb'=>'PUT'),
                array('api/delete', 'pattern'=>'^api/user/<model:\w+>/<id:\d+>', 'verb'=>'DELETE'),
                array('api/add', 'pattern'=>'^api/user/<model:\w+>', 'verb'=>'POST'),
                array('api/test', 'pattern'=>'^api/user/test/<model:\w+>'),
                array('api/login', 'pattern'=>'^api/user/<model:\w+>/login'),
                array('api/logout', 'pattern'=>'^api/user/<model:\w+>/logout'),


                // Other controllers
                '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
                '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',                
                '<action:\w+>'=>'site/<action>',
            );
        }
        return parent::processRules();
    }
}

我的问题是,如何将请求路由到模块中的Controller?即module / RestApi / controller / UserApiController.php

array('ModuleController/action' , pattern=>'api/user/<model>' , 'verb'=>'GET)

我想到了这个

'controllerMap' => array(
    'api'=>'application.modules.RestApi.components.ApiManager',
),

但我非常确定我需要两个访问点,一个用于处理api上的管理任务,一个用于用户,所以目前我的控制器结构如下:

  • RestApiController
  • UserApiController(扩展RestApiController)
  • AdminApiController(扩展RestApiController)

那么,如果有办法将动作动态路由到可能有效的子控制器?希望我没有在这里混淆真的希望你们Yii Masters可以帮助解决这个问题!!

提前致谢

1 个答案:

答案 0 :(得分:1)

我可能误解了你的问题(如果我这样做,请纠正我),但是你不能只使用正常的urlmanager和“正常”规则配置如下:

'rules' = array(
    //Api Rest Patterns
    array('restApi/userApi/list', 'pattern'=>'^api/user/<model:\w+>', 'verb'=>'GET'),
    array('restApi/userApi/view', 'pattern'=>'^api/user/<model:\w+>/<id:\d+>', 'verb'=>'GET'),
    array('restApi/userApi/update', 'pattern'=>'^api/user/<model:\w+>/<id:\d+>', 'verb'=>'PUT'),
    array('restApi/userApi/delete', 'pattern'=>'^api/user/<model:\w+>/<id:\d+>', 'verb'=>'DELETE'),
    array('restApi/userApi/add', 'pattern'=>'^api/user/<model:\w+>', 'verb'=>'POST'),
    array('restApi/userApi/test', 'pattern'=>'^api/user/test/<model:\w+>'),
    array('restApi/userApi/login', 'pattern'=>'^api/user/<model:\w+>/login'),
    array('restApi/userApi/logout', 'pattern'=>'^api/user/<model:\w+>/logout'),


    // Other controllers
    '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
    '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',                
    '<action:\w+>'=>'site/<action>',
)

我很确定这样的东西应该有用(虽然不完全确定camelCasing)。模块操作的路由为'<moduleid>/<controllerid>/<actionid>',我肯定知道,因为我多次使用它。