建站赔补,注册安全工程师查询官网,ui设计学什么专业,wordpress下载类模板使用yii框架的url路径一般形如hostname/?rxxxx/xxxx/xxxxsdfsdsfdsf我们可以看到有时会使用protected目录下的controller#xff0c;有时会使用module中controller#xff0c;具体是如何处理的呢#xff0c;请看如下的分析#xff1a;以下代码摘自yii框架核心代码%Yi… 使用yii框架的url路径一般形如hostname/?rxxxx/xxxx/xxxxsdfsdsfdsf我们可以看到有时会使用protected目录下的controller有时会使用module中controller具体是如何处理的呢请看如下的分析以下代码摘自yii框架核心代码%Yiiroot%/framework/web/CWebApplication.php//1.runController是执行一个controller的方法,$route是$_GET[r] public function runController($route) {//在这里调用createController先去创建一个controller实例由此可见createController是选择controller的关键 if(($ca$this-createController($route))!null) {list($controller,$actionID)$ca;$oldController$this-_controller;$this-_controller$controller;$controller-init();$controller-run($actionID);$this-_controller$oldController; }elsethrow new CHttpException(404,Yii::t(yii,Unable to resolve the request {route}.,array({route}$route?$this-defaultController:$route))); }//2.接下来我们分析createController,假设我们访问的route是site/contactpublic function createController($route,$ownernull) {//首次进入这个函数$owner参数为空 if($ownernull)$owner$this;//如果$route参数中不含/那么使用默认的controller if(($routetrim($route,/)))$route$owner-defaultController;$caseSensitive$this-getUrlManager()-caseSensitive;//为了能够完整运行下面的循环给$route后面加一个/ $route./;//将/的位置保存在$pos中 while(($posstrpos($route,/))!false) {//$id是前半部分即site $idsubstr($route,0,$pos);if(!preg_match(/^\w$/,$id))return null;if(!$caseSensitive)$idstrtolower($id);//$route变成后半部分即contact $route(string)substr($route,$pos1);//controller根目录或子目录前缀 if(!isset($basePath)) // first segment {//首次进入$owner为空没有这个成员变量 //非首次进入或$owner有值有可能设置了这个成员变量参见CWebModule类 if(isset($owner-controllerMap[$id])) {return array( Yii::createComponent($owner-controllerMap[$id],$id,$owner$this?null:$owner),$this-parseActionParams($route), ); }//如果能通过getModule方法获取到一个独立模块则再次调用createController适用于site是module名的情况参考protected/config/main.php配置文件例如你的controller在%webroot%/protected/module/site/controller/ContactController.php if(($module$owner-getModule($id))!null)return $this-createController($route,$module);//controller的目录 //对于CWebApplication对应config[basePath](参见配置文件)./controller/例如你的controller在%webroot%/protected/controller/SiteController.php //对于CModule的子类对应改子类所在文件夹./contoller/例如你的controller在%webroot%/protected/module/site/controller/ContactController.php $basePath$owner-getControllerPath();$controllerID; }else$controllerID./;$classNameucfirst($id).Controller;$classFile$basePath.DIRECTORY_SEPARATOR.$className..php;//如果$classFile存在根据上面所得到的controller类文件路径创建类实例 //如果不存在则是子目录下的controller继续循环寻找最终的controller,例如你的controller在%webroot%/protected/controller/somedir/SiteController if(is_file($classFile)) {if(!class_exists($className,false))require($classFile);if(class_exists($className,false) is_subclass_of($className,CController)) {$id[0]strtolower($id[0]);return array(new $className($controllerID.$id,$owner$this?null:$owner),$this-parseActionParams($route), ); }return null; }$controllerID.$id;$basePath.DIRECTORY_SEPARATOR.$id; } } 转自http://blog.sina.com.cn/s/blog_550ffb0b0100lj2q.html转载于:https://www.cnblogs.com/codelifezj/archive/2011/06/28/yii-controller.html