我正在寻找有关将请求路由到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上的管理任务,一个用于用户,所以目前我的控制器结构如下:
那么,如果有办法将动作动态路由到可能有效的子控制器?希望我没有在这里混淆真的希望你们Yii Masters可以帮助解决这个问题!!
提前致谢
答案 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>'
,我肯定知道,因为我多次使用它。