原文出处:http://www.iprue.com/article/118/
首先是入口文件,即index.php。(以下app代表项目文件夹,yii均代表框架主文件夹)。
载入了配置文件app/protected/config/main.php,这不是必须的。
载入框架基础文件yii/yii.php,这个类只是继承了YiiBase,实质上是载入yii/YiiBase.php。所以以下如果出现一些静 态方法Yii::xxx的,实质也就是YiiBase::xxx。(这个做法也给我们留下了以后想要修改YiiBase类的可能,具体以后再说。)
YiiBase类最主要的功能是注册了自动加载类方法(spl_autoload_register),加载框架要用到所有接口(yii/base/interfaces.php)。
Yii::createWebApplication($config)->run();
用YiiBase::createWebApplication静态方法,创建了CWebApplication(yii/web /CWebApplication.php)类实例,然后调用该父抽象类CApplication(yii/base /CApplication.php)的run方法,并且该方法调用了该类的另一个抽象方法processRequest(),该抽象方法在 CWebApplication里得到了实现。
OK,流程才正式开始……
CWebApplication->processRequest()通过UrlManager->parseUrl() (yii/web/CUrlManager.php),处理被Request(yii/web /CHttpRequest.php)normalizeRequest过的url地址。返回类似controllerID/actionID的地址,供 CWebApplication->runController调兵遣将。
通过CWebApplication->createController()找到相应Controller继承自(yii/web /CController.php)并实例化,再调用CController->run()方法,初始化相应的action,最后执行action 即CController->runActionWithFilters()。这里有几个回调函数:执行 CController->run()前会执行相应Controller的init方法,run action之前执行CWebApplication->beforeControllerAction()和 CController->beforeAction(),run action之后执行CController->afterAction()和 CWebApplication->afterControllerAction。注意先后顺序!
因为不像Cakephp有自动渲染视图的功能,所以Yii渲染视图时,一律通过render或者renderXXX方法,去执行。