模块结构
在YII中,程序入口是一个继承CApplication的CWebApplication的应用程序,在一个web请求的整个过程中,控制器,模型和视图都是由Application进行创建和控制。首先我们来看一下CWebApplication的类的继承结构:
从上面我们可以看到CWebApplication本身也是一个CModue。在YII中,模块之间是一个树形结构。即每一个模块都可以包含多个子模块,每一个子模块可以继续包含子模块.其中APP为树的头节点,如图:
- 初始化情况下:module为YII::APP,route=a/b/c/d,id=null。
- 在module=YII::APP情况下,此时id=a,route=b/c/d。
- 如果id=a为当前module下控制器,此时,module,controller,action和$_GET都确定。
- 如果id=a确定不是当前module下的控制器,
-
- 在当前module下面找到了id=a的子模块,此时就更新模块为module=YII::APP/a,并且循环上面过程。
- 在当期module下面没有找到id=a的子模块,此时module不改变,并且在后面的过程中,模块也不会再改变。此时id=a指的当前模块下的目标控制器Controller的命名空间,即controller Namespace=a。
- 后面过程主要是更新当前模块下的目标控制器Controller的命名空间。
描述的不是很清楚,但是上面流程图还是很清晰的吧。
对于读过YII源码都直到,任何一个web请求都是通过CApplication::Run()函数开始,进入到CWebApplication::processRequest()。源码分别如下:
//CApplication
public function run()
{
if($this->hasEventHandler('onBeginRequest'))
$this->onBeginRequest(new CEvent($this));
$this->processRequest();//===========
if($this->hasEventHandler('onEndRequest')