框架運行流程介紹
這樣的一個get請求http://hostname/index.php?route=common/home 發生了什么?
1. 開始執行入口文件index.php。
2. require_once(DIR_SYSTEM . 'startup.php');
做一些php的配置和加載一些類聲明,包括系統主框架文件(system/engine下的文件)、一些必用到的helper和library。
系統主框架文件包括:
registry:保存全局變量,使用了注冊者模式,controller的基類、model的基類,loader等均保存此對象的引用。沒有寫成單例模式,可能是想讓這個類更通用,可以額外new一個registry實例,在幾個對象內做共享用;
loader:動態加載其他文件用,提供加載model、library、helper、database、config和language能力,其中加載model和database會new出一個實例將其保存到registry對象內, 對於數據類,只需一個實例;
controller,model:控制器的基類和數據模型類的基類,功能很簡單;
action:用戶的一個請求,對應一個動作,用請求的query參數route初始化action;
front:請求分發器,派發action;
下面的框架流程,會介紹這幾個類具體都干了些什么。
3. 初始化 registry、loader、db、錯誤處理函數和一些后續用到的library,並將這些library實例的引用保存到registry對象內,進而供給controller和model對象直接使用。
4. 初始化 front,action對象,此時action由url中query參數route的值"common/home"構造,action解析出對應controller文件名,類名和要執行的方法及參數。
5. front派發action,根據action的類名屬性,new出controller對象ControllerCommonHome(catalog/controller/common/home.php),並用registry初始化,然后根據action的方法index(如果沒傳方法,默認為index)和參數屬性(無),執行ControllerCommonHome->index(),index方法內,處理業務邏輯,加載模板等,最后將要輸出到瀏覽器的內容保存到response內。注意controller的魔術方法 __get和__set,均從registry對象取值和賦值,所以可以像使用自己的屬性一樣,使用保存在registry的對象。例如:$this->load->model('catalog/category'), 調用loader對象的model方法。
6. index.php 內最后一行$response->output() 將內容輸返回給用戶。
至此框架處理完用戶該請求。
另見 本人寫的一個opencart插件 opencart 百度登錄和百度錢包支付插件 響應式適應pc/mobile