原文出處: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方法,去執行。