|
OpenCart是一個代碼設計精緻小巧的電子商務系統。
1、MVC架構:
OpenCart是基於MVC範式的。
model層負責獲取數據。和其他一些框架如CakePHP相比,model的功能實現有限但簡潔,直接調用DB類實現數據CRUD操作。
(CakePHP的模型層支持基礎數據驗證,複雜業務邏輯由Controller層處理)。
controller層負責處理請求,從model獲取數據,提交給view層模板。
view負責組織展示。
2、“Registry”設計模式
在OP中,Registry是整個系統的信息中樞。
Registry是一個單例(Singleton),在index.php起始頁面中,
首先作為構造函數參數傳遞給所要用到的類創建類實例,並隨之將這個類實例設置到這個“註冊表”中,
這個註冊表就像是一個共享的數據總線一樣,把各個模塊/數據串聯在一起。
// Registry
$registry = new Registry();
// Front Controller
$controller = new Front($registry);
3、整體流程
(1)創建Registry對象
(2)註冊所有公共類
(3)創建Front類對象,作為請求分發器(Dispatcher)
(4)根據用戶請求(url)創建控制器對象及其動作。
在Front類私有函數execute($action)中如下語句
$controller = new $class($this->registry); //創建控制器
(5)控制器加載相應的模型,如
$this->load->model('design/layout');(注意前後的模型,/ 線前面是模型下的文件目錄名後面是目錄下的文件名 ,也是模型對象)
該語句將創建相應的model對象。(相當NEW對像,加載進模型後就可以使用了,一般處理複雜程序或需要重用時就會建模型,每個模型是一個類)
如:
$this->load->model('user/user');//加載後模型類名$this->文件目錄->文件名(文件目錄是指model下的目錄名)
$this->model_user_user->getTotalUsersByEmail($this->request->post['email'])
(6)控制器獲取模板,繪製(提取數據並啟用output buffer)到頁面輸出區output中
$this->render();
(7)最後Response對象把輸出區的數據(頁面)echo返回給用戶
如:if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/product/product.tpl')) {
$this->template = $this->config->get('config_template') . '/template/product/product.tpl';
} else {
$this->template = 'default/template/product/product.tpl';
}
$this->children = array(
'common/column_left',
'common/column_right',
'common/content_top',
'common/content_bottom',
'common/footer',
'common/header'
);
$this->response->setOutput($this->render());
4、魔術函數(Magic method)
在Controller中調用$this->load->...時,熟悉面向對象語言的開發人員會覺得有點奇怪,因為Controller基類中並沒有$load成員變量。
實際上這是由PHP5魔術函數來實現的。__get(), __set()函數在獲取/設置非類定義成員變量的時候,會由PHP自動調用。
那麼OP中在執行$this->load->...時實際調用的是:
public function __get($key) { return $this->registry->get($key); }
現在體會到Registry'共享總線'的作用了吧。
MVC本來是存在於Desktop程序中的,M是指數據模型,V是指用戶界面,C則是控制器。使用MVC的目的是將M和V的實現代碼分離
數據模型包括數據庫數據的結構部分、數據庫數據的操作部分和數據庫數據的約束條件。
|
|