opencart框架分析與概況


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: 架構概覽

 

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的實現代碼分離


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM