2022-11-02 11:10:49 - 米境通跨境電商
OpenCart是一套比較簡(jiǎn)單的MVC架構(gòu)的php開(kāi)源電子商務(wù)程序,完全沒(méi)有Magento系統(tǒng)那么復(fù)雜。當(dāng)然簡(jiǎn)單的代價(jià)是相應(yīng)的功能和安全性能上的不足。不過(guò)OpenCart系統(tǒng)中的一些經(jīng)典設(shè)計(jì)還是很值得學(xué)習(xí)的。
OpenCart首先將前臺(tái)和后臺(tái)完全分離開(kāi)來(lái),后臺(tái)文件結(jié)構(gòu)在admin/目錄下;而前臺(tái)在catalog/目錄,入口文件index.php在根目錄下。各自都有一個(gè)可以做不同設(shè)置的配置文件config.php,在這里設(shè)置一些目錄路徑常量、數(shù)據(jù)庫(kù)信息等。下面以O(shè)penCart前臺(tái)為例看看文件結(jié)構(gòu)和MVC模式:
Catalog前臺(tái)
|
index.php入口文件
||載入配置文件config.php
||檢測(cè)是否新安裝,是則跳轉(zhuǎn)到install/index.php
||載入啟動(dòng)類(lèi)(/system/startup.php)(程序引擎system/engine/核心類(lèi)system/library/helper類(lèi)system/helper)
||載入應(yīng)用程序模塊類(lèi)(自動(dòng)預(yù)加載的常用模塊類(lèi),如customer和tax等)
|
啟動(dòng)引擎Engine
||引入engine/registry.php實(shí)例化下面的類(lèi)并設(shè)置
||實(shí)例化加載器engine/loader.php,配置類(lèi)library/config.php,數(shù)據(jù)庫(kù)library/db.php以及l(fā)ibrary/url.php
||獲取商店Store和商店設(shè)置Settings,定義錯(cuò)誤類(lèi)
|
處理請(qǐng)求request/response
||實(shí)例化library/request.php,library/response.php,library/cache.php,library/sesshion.php
||語(yǔ)言檢測(cè),設(shè)置語(yǔ)言類(lèi)library/language.php
||其他常用預(yù)加載模塊類(lèi)的實(shí)例化和引入,如library/document.php,customer,tax等
|
前臺(tái)控制器/engine/front.php
||addPreAction1:dispatch之前判斷是否處于MaintenanceMode
||addPreAction2:dispatch之前執(zhí)行SEOurl設(shè)置catalog/controller/common/seo_url.php
||request獲取route變量傳遞給Action,然后由前臺(tái)控制器的dispatch方法處理該Action。
然后Dispatch開(kāi)始引入MVC架構(gòu),整個(gè)過(guò)程由Controller貫穿:
Dispatch
||Dispatch請(qǐng)求的Action
Pre_Action
||預(yù)處理action作為子Action
Action
||繼承自基礎(chǔ)控制器類(lèi)/engine/controller.php的類(lèi)方法
默認(rèn)index()方法
||通過(guò)LoadModel(engine/loader.php)和相應(yīng)的Model通信如catalog/model/catalog/category.php)
Model
||Model:類(lèi)方法執(zhí)行sql語(yǔ)句,從數(shù)據(jù)庫(kù)(library/db.php)中查詢(xún)或操作數(shù)據(jù),沒(méi)有引入pdo等數(shù)據(jù)庫(kù)抽象類(lèi)
Controller:返回結(jié)果保存到$this->data[]數(shù)組
||Controller處理業(yè)務(wù)邏輯
View:$this->template指定模板
||View負(fù)責(zé)內(nèi)容呈現(xiàn)方式和樣式。
Controller:$this->render接受$this->data[]和$this->template
||傳遞回response
Controller:$this-response->setOutput()
||最后由response輸出