2022-09-16 10:05:48 - 米境通跨境電商
用了一年的Opencart,總覺得要記下點什么。一方面檢驗一下自己對這個開源程序的理解程度,另一方面是作個筆記,以備不時之需!
1.MVCL
MVC算是老生常談了,opencart里多了一個語言層L,在目錄里看起來是這樣的:
opencart
|--admin
|--catalog
|----controller
|----language
|----model
|----view
|--image
|--system
|--index.php
opencart是網(wǎng)站根目錄,catalog前臺,system核心文件。這樣的結(jié)構(gòu)目錄看起來一目了然
2.注冊樹模式
opencart的核心架構(gòu)運用的是注冊樹模式,registry.php
finalclassRegistry{
private$data=array();
publicfunctionget($key){
return(isset($this->data[$key])?$this->data[$key]:null);
}
publicfunctionset($key,$value){
$this->data[$key]=$value;
}
publicfunctionhas($key){
returnisset($this->data[$key]);
}
}
入口文件index.php中則這樣:
//Registry
$registry=newRegistry();
//Loader
$loader=newLoader($registry);
$registry->set('load',$loader);
把所有核心文件的實例都保存在Registry對象中,其結(jié)果就是Registry對象像一顆巨大的樹,包含了所有控制結(jié)構(gòu)的對象,然后,
在控制器中加載語言包這樣的:
1$this->load->language('checkout/cart');
加載模型是這樣的:
$this->load->model('catalog/product');
接收表單參數(shù)這樣的:
$this->request->post['quantity']
加載配置文件:
$this->config->get('config_template')
加載模版:
$this->load->view('default/template/error/not_found.tpl',$data)
這樣的好處是我們在處理業(yè)務邏輯的時候可以以這樣的方法調(diào)用任意模版、模型、配置文件、第三方類庫等。雖然看起來這樣加載顯得冗余,且大多數(shù)時候也確實不需要這么多的類庫,但是opencart的核心文件非常小巧,這樣的設計我覺得還是比較高效的。
3.前端控制器(FrontController)、路由和輸出
3.1在控制器目錄controller/common中有兩個特殊的控制器類maintenance.php和seo_url.php每次有url請求時在入口處都是先加載這兩個類,這兩個類的2個作用:
a.劫取每次請求的url并重新處理,當然也可以不處理url,具體在配置文件中配置
b.類似鉤子,配合接下來的路由選擇分發(fā)
3.2路由
a.front.php負責分發(fā)(dispatch),并用maintenance.php或seo_url.php去調(diào)用action.php類
b.action.php獲取當前請求的url,實例化并執(zhí)行
3.3輸出
a.打開緩沖區(qū),把當前控制器的$data變量和對應的模版全部輸出,并保存在Response.php類的私有變量$output中
publicfunctionview($template,$data=array()){
$file=DIR_TEMPLATE.$template;
if(file_exists($file)){
extract($data);
ob_start();
require($file);
$output=ob_get_contents();
ob_end_clean();
return$output;
}else{
trigger_error('Error:Couldnotloadtemplate'.$file.'!');
exit();
}
}
publicfunctionsetOutput($output){
$this->output=$output;
}
b.入口文件最后一句,$response->output();輸出