TShopping

 找回密碼
 註冊
搜索
查看: 1149|回復: 0

[教學] OpenCart: 架構概覽

[複製鏈接]
發表於 2014-10-15 16:53:47 | 顯示全部樓層 |閱讀模式
 
Push to Facebook
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的實現代碼分離

數據模型包括數據庫數據的結構部分、數據庫數據的操作部分和數據庫數據的約束條件。


 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-3-29 07:16 , Processed in 0.158766 second(s), 23 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表