1. Opencart的系統架構 1.1. 架構分析 Opencart是有自己的開發架構的,其架構的核心都在system\engine 下,訪問控制統一用 根目錄下的 index.php 來協調。 Route 就是起到一個中轉器的作用,它會根據你的Route目錄去找到它要執行的方法,比如: index.php?route=account/login 根據這個route,op的框架會找到Controller下的Account裡的Login.php, 注意login.php的類名一定是這種格式的ControllerAccoutLogin{...} 否則Op就識別不了目錄,route=account/login 會執行類的默認方法:index 如果要指明執行那個方法,則在login後面再加上 route=account/login/你定義的方法名 並且在login.php 裡定義你要執行的方法。 (如在common目錄下的home.php 定義個函數 public function aa(){ echo "袁盛武"; }訪問地址如下: http://127.0.0.1/opencart/index.php?route=common/home/aa就會只輸出袁盛武) 同理,Op裡 load 語言包和model等都是以這種機制為基礎的。請結合程序,應該是比較好理解的。 至於View層,Op都是把要顯示的數據加載到 this->data裡去的,這樣就可以用 $變量名 在頁面上顯示變量了。 1.2. Op系統配置文件 (這段是引用別人的。。。找不到出處了 - - 作者看到請聯繫我) 在Op的目錄下,可以發現一個 Config.php文件,這裡是配置一些OP要使用到的配置路徑,並且是每個單獨項目裡都有一個單獨的配置(這點要注意),比如admin和catalog下就分別有這個文件。 OpenCart是使用面向對像編程的,同時又使用了MVC的設計思想,因此在解讀其源代碼時是看不到過程式的代碼的。同時它把MVC框架部分單獨放在library目錄中,這個部分的內容一般是不作修改的。就像你顯式地使用其它框架編程一樣。 Engine下有一個裝配器文件:loader.php,這個文件中只有一個類:loader,實際上是一個調度程序,框架中的其它組件,如controller,module,session,cache,language統統由它裝載調度。 為了讓系統運行起來, 像所有的PHP程序一樣,OpenCart需要把系統中的一些重要的參數從config.php中,對於這個文件,按慣例,使用一句: require('config.php'); 連接數據庫的DSN參數和相關目錄設置就可用了,下面有必要將config.php文件列表在下,這有利於我們理解OpenCart的設計思想: // HTTP define('HTTP_SERVER', 'http://localhost/cnopencart/'); define('HTTP_IMAGE', 'http://localhost/cnopencart/image/'); // HTTPS define('HTTPS_SERVER', ''); define('HTTPS_IMAGE', ''); // DIR define('DIR_CACHE', 'C:\wamp\www\cnopencart/cache/'); define('DIR_DOWNLOAD', 'C:\wamp\www\cnopencart/download/'); define('DIR_IMAGE', 'C:\wamp\www\cnopencart/image/'); define('DIR_LIBRARY', 'C:\wamp\www\cnopencart/library/'); define('DIR_MODEL', 'C:\wamp\www\cnopencart\catalog/model/'); define('DIR_CONTROLLER', 'C:\wamp\www\cnopencart\catalog/controller/'); define('DIR_LANGUAGE', 'C:\wamp\www\cnopencart\catalog/language/'); define('DIR_EXTENSION', 'C:\wamp\www\cnopencart\catalog/extension/'); define('DIR_TEMPLATE', 'C:\wamp\www\cnopencart\catalog/template/'); // DB define('DB_HOST', 'localhost'); define('DB_USER', 'root'); define('DB_PASSWORD', '111111'); define('DB_NAME', 'opencart'); ?> 與別的系統可能有些不同是的,OpenCart有一個config類用來從別的設置文件或數據庫裡存取數據,這些數據也是在程序一開始運行就需要的,因此第一個由loader裝載的就是config類,裝載config類就只簡單地用了一句: // Config $config =$this->load->.... 其它所有的對象這是以這種方法來進行管理。 2. Op的加載器 2.1. 系統加載 在System下有一些公共類,所以的基礎類和公共類都是通過index.php 去加載的,這樣你就可以去加載你需要的類和文件了。比如: $loader = new Loader(); Registry::set('load', $loader); 然後你就可以在系統裡調用Load方法去加載需要的Model和language 文件了。調用方式如下: $this->load->.... Op裡就是通過這個方法來註冊他所需要的資源的。 =================================================
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的實現代碼分離 數據模型包括數據庫數據的結構部分、數據庫數據的操作部分和數據庫數據的約束條件。 |