TShopping

 找回密碼
 註冊
搜索
查看: 1613|回復: 3

[教學] OpenCart 架構分析與概覽

  [複製鏈接]
發表於 2013-3-13 12:47:38 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk Push to Twitter 
1. Opencart的系統架構
  1.1. 架構分析
  Opencart是有自己的開發架構的,其架構的核心都在system\engine 下,訪問控制統一用 根目錄下的 index.php 來協調。
  Route 就是起到一個中轉器的作用,它會根據你的Route目錄去找到它要執行的方法,比如:
  index.php?route=account/login
  根據這個routeop的框架會找到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就會只輸出袁盛武)
  同理,Opload 語言包和model等都是以這種機制為基礎的。請結合程序,應該是比較好理解的。
至於View層,Op都是把要顯示的數據加載到 this->data裡去的,這樣就可以用 $變量名 在頁面上顯示變量了。
  1.2. Op系統配置文件 (這段是引用別人的。。。找不到出處了 - - 作者看到請聯繫我)
  在Op的目錄下,可以發現一個 Config.php文件,這裡是配置一些OP要使用到的配置路徑,並且是每個單獨項目裡都有一個單獨的配置(這點要注意),比如admincatalog下就分別有這個文件。
  OpenCart是使用面向對像編程的,同時又使用了MVC的設計思想,因此在解讀其源代碼時是看不到過程式的代碼的。同時它把MVC框架部分單獨放在library目錄中,這個部分的內容一般是不作修改的。就像你顯式地使用其它框架編程一樣
  Engine下有一個裝配器文件:loader.php,這個文件中只有一個類:loader,實際上是一個調度程序,框架中的其它組件,如controller,modulesession,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方法去加載需要的Modellanguage 文件了。調用方式如下:
  $this->load->....
Op裡就是通過這個方法來註冊他所需要的資源的。
=================================================

OpenCart是一個代碼設計精緻小巧的電子商務系統。
1MVC架構:
OpenCart是基於MVC範式的。
model層負責獲取數據。和其他一些框架如CakePHP相比,model的功能實現有限但簡潔,直接調用DB類實現數據CRUD操作。
CakePHP的模型層支持基礎數據驗證,複雜業務邏輯由Controller層處理)。
controller層負責處理請求,從model獲取數據,提交給view層模板。
view負責組織展示。

2Registry設計模式
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的目的是將MV的實現代碼分離
數據模型包括數據庫數據的結構部分、數據庫數據的操作部分和數據庫數據的約束條件。

 

臉書網友討論
發表於 2013-11-6 18:48:41 | 顯示全部樓層
哥回的不是貼是在灌水

版主招募中

發表於 2013-12-26 14:42:38 | 顯示全部樓層
感謝分享,這幫助很多


發表於 2014-8-21 21:07:33 | 顯示全部樓層



   浮云啊  不是浮云吧。。


您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



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

GMT+8, 2016-12-4 01:30 , Processed in 0.076478 second(s), 22 queries .

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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