Yii框架執行流程
阿新 • • 發佈:2019-02-04
一 目錄檔案
|-framework 框架核心庫
|--base 底層類庫資料夾,包含CApplication(應用類,負責全域性的使用者請求處理,它管理的應用元件集,將提供特定功能給整個應用程式),CComponent(元件類,該檔案包含了基於元件和事件驅動程式設計的基礎類,從版本1.1.0開始,一個行為的屬性(或者它的公共成員變數或它通過getter和/或setter方法??定義的屬性)可以通過元件的訪問來呼叫),CBehavior(行為類,主要負責宣告事件和相應事件處理程式的方法、將物件的行為附加到元件等等),CModel(模型類,為所有的資料模型提供的基類),CModule(是模組和應用程式的基類,主要負責應用元件和子模組)等等
|--caching 所有快取方法,其中包含了Memcache快取,APC快取,資料快取,CDummyCache虛擬快取,CEAcceleratorCache快取等等各種快取方法
|--cli YII專案生成指令碼
|--collections 用php語言構造傳統OO語言的資料儲存單元。如:佇列,棧,雜湊表等等
|--console YII控制檯
|--db 資料庫操作類
|--gii YII 程式碼生成器(腳手架),能生成包括模型,控制器,檢視等程式碼
|--i18n YII 多語言,提供了各種語言的本地化資料,資訊、檔案的翻譯服務、本地化日期和時間格式,數字等
|--logging 日誌元件,YII提供了靈活和可擴充套件的日誌記錄功能。訊息記錄可分為根據日誌級別和資訊類別。應用層次和類別過濾器,可進一步選擇的訊息路由到不同的目的地,例如檔案,電子郵件,瀏覽器視窗,等等|--messages 提示資訊的多語言
|--test YII提供的測試,包括單元測試和功能測試
|--utils 提供了常用的格式化方法
|--validators 提供了各種驗證方法
|--vendors 這個資料夾包括第三方由Yii框架使用的資料庫
|--views 提供了YII錯誤、日誌、配置檔案的多語言檢視
|--web YII所有開發應用的方法
|---actions 控制器操作類
|---auth 許可權認識類,包括身份認證,訪問控制過濾,基本角色的訪問控制等
|---filters 過濾器,可被配置在控制器動作執行之前或之後執行。例如, 訪問控制過濾器將被執行以確保在執行請求的動作之前使用者已通過身份驗證;效能過濾器可用於測量控制器執行所用的時間
|---form 表單生成方法
|---helpers 檢視助手,包含GOOGLE AJAX API,建立HTML,JSON,JAVASCRIPT相關功能
|---js JS庫
|---renderers 檢視渲染元件
|---services 封裝SoapServer並提供了一個基於WSDL的Web服務
|---widgets 部件
|---CArrayDataProvider.php 可以配置的排序和分頁屬性自定義排序和分頁的行為
|---CActiveDataProvider.php ActiveRecord方法類
|---CController.php 控制器方法,主要負責協調模型和檢視之間的互動
|---CPagination.php 分頁類
|---CUploadedFile.php 上傳檔案類
|---CUrlManager.php URL管理
|---CWebModule.php 應用模組管理,應用程式模組可被視為一個獨立的子應用
等等方法
|--.htaccess 重定向檔案
|--yii.php 引導檔案
|--YiiBase.php YiiBase類最主要的功能是註冊了自動載入類方法,載入框架要用到所有介面。
|--yiic Yii LINUX 命令列指令碼
|--yiic.bat YII WINDOW 命令列指令碼
|--yiilite.php 它是一些常用到的 Yii 類檔案的合併檔案。在檔案中,註釋和跟蹤語句都被去除。因此,使用 yiilite.php 將減少被引用的檔案數量並避免執行跟蹤語句
二 原始碼分析
1. 啟動
網站的唯一入口程式 index.php :
1. $yii=dirname(__FILE__).'/../framework/yii.php';
2. $config=dirname(__FILE__).'/protected/config/main.php';
3.
4. // remove the following line when in production mode
5. defined('YII_DEBUG') or define('YII_DEBUG',true);
6.
7. require_once($yii);
8. Yii::createWebApplication($config )->run();
上面的require_once($yii) 引用出了後面要用到的全域性類Yii,Yii類是YiiBase類的完全繼承:
1. class Yii extends YiiBase
2. {
3. }
系統的全域性訪問都是通過Yii類(即YiiBase類)來實現的,Yii類的成員和方法都是static型別。
2. 類載入
Yii利用PHP5提供的spl庫來完成類的自動載入。在YiiBase.php 檔案結尾處
1. spl_autoload_register(array('YiiBase','autoload'));
將YiiBase類的靜態方法autoload 註冊為類載入器。 PHP autoload 的簡單原理就是執行 new 建立物件或通過類名訪問靜態成員時,系統將類名傳遞給被註冊的類載入器函式,類載入器函式根據類名自行找到對應的類檔案並include 。
下面是YiiBase類的autoload方法:
1. public static function autoload($className)
2. {
3. // use include so that the error PHP file may appear
4. if(isset(self::$_coreClasses[$className]))
5. include(YII_PATH.self::$_coreClasses[$className]);
6. else if(isset(self::$_classes[$className]))
7. include(self::$_classes[$className]);
8. else
9. include($className.'.php');
10. }
可以看到YiiBase的靜態成員$_coreClasses 數組裡預先存放著Yii系統自身用到的類對應的檔案路徑:
1. private static $_coreClasses=array(
2. 'CApplication' => '/base/CApplication.php',
3. 'CBehavior' => '/base/CBehavior.php',
4. 'CComponent' => '/base/CComponent.php',
5. ...
6. )
非 coreClasse 的類註冊在YiiBase的$_classes 陣列中:
private static $_classes=array();
其他的類需要用Yii::import()將類路徑匯入PHP include paths 中,直接
include($className.'.php')
|-framework 框架核心庫
|--base 底層類庫資料夾,包含CApplication(應用類,負責全域性的使用者請求處理,它管理的應用元件集,將提供特定功能給整個應用程式),CComponent(元件類,該檔案包含了基於元件和事件驅動程式設計的基礎類,從版本1.1.0開始,一個行為的屬性(或者它的公共成員變數或它通過getter和/或setter方法??定義的屬性)可以通過元件的訪問來呼叫),CBehavior(行為類,主要負責宣告事件和相應事件處理程式的方法、將物件的行為附加到元件等等),CModel(模型類,為所有的資料模型提供的基類),CModule(是模組和應用程式的基類,主要負責應用元件和子模組)等等
|--caching 所有快取方法,其中包含了Memcache快取,APC快取,資料快取,CDummyCache虛擬快取,CEAcceleratorCache快取等等各種快取方法
|--cli YII專案生成指令碼
|--collections 用php語言構造傳統OO語言的資料儲存單元。如:佇列,棧,雜湊表等等
|--console YII控制檯
|--db 資料庫操作類
|--gii YII 程式碼生成器(腳手架),能生成包括模型,控制器,檢視等程式碼
|--i18n YII 多語言,提供了各種語言的本地化資料,資訊、檔案的翻譯服務、本地化日期和時間格式,數字等
|--logging 日誌元件,YII提供了靈活和可擴充套件的日誌記錄功能。訊息記錄可分為根據日誌級別和資訊類別。應用層次和類別過濾器,可進一步選擇的訊息路由到不同的目的地,例如檔案,電子郵件,瀏覽器視窗,等等|--messages 提示資訊的多語言
|--test YII提供的測試,包括單元測試和功能測試
|--utils 提供了常用的格式化方法
|--validators 提供了各種驗證方法
|--vendors 這個資料夾包括第三方由Yii框架使用的資料庫
|--views 提供了YII錯誤、日誌、配置檔案的多語言檢視
|--web YII所有開發應用的方法
|---actions 控制器操作類
|---auth 許可權認識類,包括身份認證,訪問控制過濾,基本角色的訪問控制等
|---filters 過濾器,可被配置在控制器動作執行之前或之後執行。例如, 訪問控制過濾器將被執行以確保在執行請求的動作之前使用者已通過身份驗證;效能過濾器可用於測量控制器執行所用的時間
|---form 表單生成方法
|---helpers 檢視助手,包含GOOGLE AJAX API,建立HTML,JSON,JAVASCRIPT相關功能
|---js JS庫
|---renderers 檢視渲染元件
|---services 封裝SoapServer並提供了一個基於WSDL的Web服務
|---widgets 部件
|---CArrayDataProvider.php 可以配置的排序和分頁屬性自定義排序和分頁的行為
|---CActiveDataProvider.php ActiveRecord方法類
|---CController.php 控制器方法,主要負責協調模型和檢視之間的互動
|---CPagination.php 分頁類
|---CUploadedFile.php 上傳檔案類
|---CUrlManager.php URL管理
|---CWebModule.php 應用模組管理,應用程式模組可被視為一個獨立的子應用
等等方法
|--.htaccess 重定向檔案
|--yii.php 引導檔案
|--YiiBase.php YiiBase類最主要的功能是註冊了自動載入類方法,載入框架要用到所有介面。
|--yiic Yii LINUX 命令列指令碼
|--yiic.bat YII WINDOW 命令列指令碼
|--yiilite.php 它是一些常用到的 Yii 類檔案的合併檔案。在檔案中,註釋和跟蹤語句都被去除。因此,使用 yiilite.php 將減少被引用的檔案數量並避免執行跟蹤語句
二 原始碼分析
1. 啟動
網站的唯一入口程式 index.php :
1. $yii=dirname(__FILE__).'/../framework/yii.php';
2. $config=dirname(__FILE__).'/protected/config/main.php';
3.
4. // remove the following line when in production mode
5. defined('YII_DEBUG') or define('YII_DEBUG',true);
6.
7. require_once($yii);
8. Yii::createWebApplication($config
上面的require_once($yii) 引用出了後面要用到的全域性類Yii,Yii類是YiiBase類的完全繼承:
1. class Yii extends YiiBase
2. {
3. }
系統的全域性訪問都是通過Yii類(即YiiBase類)來實現的,Yii類的成員和方法都是static型別。
2. 類載入
Yii利用PHP5提供的spl庫來完成類的自動載入。在YiiBase.php 檔案結尾處
1. spl_autoload_register(array('YiiBase','autoload'));
將YiiBase類的靜態方法autoload 註冊為類載入器。
下面是YiiBase類的autoload方法:
1. public static function autoload($className)
2. {
3. // use include so that the error PHP file may appear
4. if(isset(self::$_coreClasses[$className]))
5. include(YII_PATH.self::$_coreClasses[$className]);
6. else if(isset(self::$_classes[$className]))
7. include(self::$_classes[$className]);
8. else
9. include($className.'.php');
10. }
可以看到YiiBase的靜態成員$_coreClasses 數組裡預先存放著Yii系統自身用到的類對應的檔案路徑:
1. private static $_coreClasses=array(
2. 'CApplication' => '/base/CApplication.php',
3. 'CBehavior' => '/base/CBehavior.php',
4. 'CComponent' => '/base/CComponent.php',
5. ...
6. )
非 coreClasse 的類註冊在YiiBase的$_classes 陣列中:
private static $_classes=array();
其他的類需要用Yii::import()將類路徑匯入PHP include paths 中,直接
include($className.'.php')