• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Yii框架分析(四)——WebApplication的run函数详细解析

php 搞代码 4年前 (2022-01-04) 40次浏览 已收录 0个评论

Yii应用的入口脚本最后一句启动了WebApplication

Yii::createWebApplication($config)->run();

CApplication:

public function run(){    $this->onBeginRequest(new CEvent($this));    $this->processRequest();    $this->onEndRequest(new CEvent($this));}

processRequest()开始处理请求,由CWebApplication实现:

public function processRequest(){    if(is_array($this->catchAllRequest) && isset($this->catchAllRequest[0]))    {        $route=$this->catchAllRequest[0];        foreach(array_splice($this->catchAllRequest,1) as $name=>$value)            $_GET[$name]=$value;    }    else        $route=$this->getUrlManager()->parseUrl($this->getRequest());    $this->runController($route);}

urlManager应用组件的parseUrl() 创建了$route (形式为controllerID/actionID的字符串),runController()创建Controller对象开始处理http请求。

$route 的值可能存在以下几种情况:
– 为空: 用 defaultController 值代替;
– “moduleID/controllerID/actionID”: module下的
– “controllerID/actionID” : 最常见的形式
– “folder1/folder2/controllerID/actionID” 多级目录下的控制器

runController首先调用createController()创建控制器对象

public function createController($route,$owner=null){    // $owner为空则设置为$this,即 $_app对象    if($owner===null)        $owner=$this;    // $route为空设置为defaultController,在$config里配置    if(($route=trim($route,’/'))===”)        $route=$owner->defaultController;    $caseSensitive=$this->getUrlManager()->caseSensitive;     $route.=’/';    // 逐一取出 $route 按 ‘/’分割后的第一段进行处理    while(($pos=strpos($route,’/'))!==false)    {        // $id 里存放的是 $route 第一个 ‘/’前的部分        $id=substr($route,0,$pos);        if(!preg_match(‘/^\w+$/’,$id))            return null;        if(!$caseSensitive)            $id=strtolower($id);        // $route 存放’/’后面部分        $route=(string)substr($route,$pos+1);        if(!isset($basePath)) // 完整$route的第一段        {            // 如果$id在controllerMap[]里做了映射            // 直接根据$id创建controller对象            if(isset($owner->controllerMap[$id]))            {                return array(                    Yii::createComponent($owner->controllerMap[$id],$id,$owner===$this?null:$owner),                    $this->parseActionParams($route),                );            }             // $id 是系统已定义的 module,根据$id取得module对象作为$owner参数来createController            if(($module=$owner->getModule($id))!==null)                return $this->createController($route,$module);            // 控制器所在的目录            $basePath=$owner->getControllerPath();            $controllerID=”;        }        else            $controllerID.=’/';        $className=ucfirst($id).’Controller’;        $classFile=$basePath.DIRECTORY_SEPARATOR.$className.’.php’;        // 控制器类文件存在,则r<p style="color:transparent">来源gao!%daima.com搞$代*!码网</p>equire并创建控制器对象&返回        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;    }}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Yii框架分析(四)——WebApplication的run函数详细解析
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址