江川
摘 要:在如今需求快速迭代,代碼規(guī)模不斷膨脹的趨勢下,傳統(tǒng)的Web應(yīng)用開發(fā)模式已經(jīng)無法滿足快速開發(fā)的要求,為了解決代碼規(guī)模的危機(jī),先進(jìn)的開發(fā)理論應(yīng)運(yùn)而生。該文基于YAF這一PHP開發(fā)中流行的MVC框架進(jìn)行改進(jìn),對YAF的Model模塊進(jìn)行內(nèi)部分層,并對基于YAF的系統(tǒng)開發(fā)進(jìn)行研究。實(shí)際表明,將系統(tǒng)進(jìn)行分層,每層對應(yīng)不同職責(zé),系統(tǒng)開發(fā)模塊化,易于維護(hù)擴(kuò)展。
關(guān)鍵詞:YAF框架 分層 模塊化
中圖分類號:TP302 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號:1672-3791(2017)03(a)-0029-02
傳統(tǒng)Web系統(tǒng)開發(fā)后端服務(wù)業(yè)務(wù)邏輯簡單,代碼沒有明顯模塊化,業(yè)務(wù)邏輯與數(shù)據(jù)訪問雜糅在一起,隨著需求逐漸復(fù)雜化,逐漸無法應(yīng)對代碼規(guī)模的擴(kuò)張,需要良好設(shè)計(jì)的開發(fā)框架進(jìn)行規(guī)范化,使系統(tǒng)易于維護(hù)擴(kuò)展,節(jié)省人力與經(jīng)濟(jì)成本。MVC與N層架構(gòu)等理論的發(fā)展,使得現(xiàn)代軟件的開發(fā)更加規(guī)范化與工程化,作為解決軟件危機(jī)的有效方法,將界面表示、業(yè)務(wù)邏輯以及數(shù)據(jù)的處理進(jìn)行模塊劃分,使各模塊各司其職,模塊之間職責(zé)劃分清晰,架構(gòu)易于理解與維護(hù)。YAF框架是基于MVC架構(gòu)的開發(fā)框架,它專注于在“最小性能損耗”與“良好的模塊封裝”中尋求平衡點(diǎn),改進(jìn)的YAF框架則將分層架構(gòu)應(yīng)用到Y(jié)AF的Model中,使得YAF框架可以適應(yīng)越來越龐大的系統(tǒng)架構(gòu)。
1 YAF框架核心架構(gòu)
與傳統(tǒng)MVC框架相同,View負(fù)責(zé)用戶界面展示;Controller負(fù)責(zé)處理與用戶進(jìn)行交互的部分,得到Model的數(shù)據(jù)后可將數(shù)據(jù)返回給View;Model表示數(shù)據(jù)和業(yè)務(wù)相關(guān)處理,并且可將數(shù)據(jù)返回給controller,一個(gè)典型的YAF框架的代碼編寫如下所示。
(1) 控制器application/controllers/Index.php
class IndexController extends Yaf_Controller_Abstract {
public function indexAction() {//默認(rèn)Action
$model = new ContentModel();
$this->getView()->assign("content", $model->getContent());
}
}
(2) 視圖application/views/index/index.phtml
<?php echo $content;?>
(3) 視圖application/model/Content.php
class ContentModel {
public function getContent() {
return “Hello World”;
}
}
2 改進(jìn)YAF
可以看到Y(jié)AF作為一種MVC框架,把系統(tǒng)拆分為“視圖、控制器”與“數(shù)據(jù)模型”三個(gè)模塊,已經(jīng)對數(shù)據(jù)的表示進(jìn)行了解耦,但Model層中依然可以既包含對業(yè)務(wù)邏輯的處理,也包含針對數(shù)據(jù)源(可以為數(shù)據(jù)庫或文本文件等)的訪問處理,使得對業(yè)務(wù)邏輯與數(shù)據(jù)的處理仍然混雜,難以維護(hù),此時(shí)我們將Model進(jìn)一步分層。針對Model的數(shù)據(jù)處理,我們可以繼續(xù)分為“頁面邏輯層、數(shù)據(jù)服務(wù)層”以及“數(shù)據(jù)訪問對象”,如圖1所示。
2.1 數(shù)據(jù)訪問對象(DAO)
一個(gè)DAO對應(yīng)一張表上具體的、無邏輯的CRUD操作,通常會(huì)有多個(gè)方法,每個(gè)方法對應(yīng)這張表上的一個(gè)操作,負(fù)責(zé)向數(shù)據(jù)服務(wù)層提供對數(shù)據(jù)進(jìn)行訪問的接口。
2.2 數(shù)據(jù)服務(wù)層(Data Service)
數(shù)據(jù)服務(wù)層在DAO這一層的基礎(chǔ)上提供一個(gè)原子功能的接口封裝,按主題提供數(shù)據(jù)操作服務(wù)給頁面服務(wù)層調(diào)用,該層中主要負(fù)責(zé)對數(shù)據(jù)進(jìn)行加工,例如時(shí)間字段的格式化、通過調(diào)用不同DAO進(jìn)行數(shù)據(jù)組合后處理以及對數(shù)據(jù)進(jìn)行緩存等操作。
2.3 頁面服務(wù)層(Page Service)
頁面服務(wù)層主要是在數(shù)據(jù)服務(wù)層提供的數(shù)據(jù)提供接口上,進(jìn)行與具體頁面的業(yè)務(wù)邏輯相關(guān)的操作,同時(shí)可以進(jìn)行對數(shù)據(jù)的合法性與安全性校驗(yàn)。
3 改進(jìn)后YAF的應(yīng)用
改進(jìn)后的YAF目錄針對架構(gòu)進(jìn)行了細(xì)化,一個(gè)典型的改進(jìn)后YAF框架的代碼編寫如下所示。
(1)控制器application/controllers/Index.php。
<?php
class ControllerIndex extends Yaf_Controller_Abstract {
public function IndexAction() {
$object = new Service_Page_Index();
return $object->execute();
}
}
(2)頁面服務(wù)層 application/model/service/page/Index.php。
class Service_Page_Index {
public function execute() {
$object = new Service_Data_Index();
return $object->getHelloData();
}
}
(3)數(shù)據(jù)服務(wù)層 application/model/service/data/Index.php。
class Service_Data_Index {
public function getHelloData() {
$object = new Dao_Index();
return $object->getData();
}
}
(4) 數(shù)據(jù)訪問對象 application/model/dao/Index.php。
class Dao_Index extends Lib_Dao{
public function getData() {
$this->useTable(‘Table)
return $object->getData();
}
}
4 結(jié)語
該文對YAF框架的架構(gòu)進(jìn)行了針對Model層的改進(jìn),使其層次更加清晰,更適合應(yīng)用到大規(guī)模系統(tǒng)開發(fā)中。對Model進(jìn)行分層使得模塊松耦合,不僅系統(tǒng)架構(gòu)更加清晰,易于理解,而且開發(fā)人員在維護(hù)系統(tǒng)時(shí)只需要針對某一層進(jìn)行修改,只要接口規(guī)范不改變,那么修改其中一層不會(huì)影響其他層,節(jié)省了維護(hù)成本。
參考文獻(xiàn)
[1] (美)斯賓奈利斯,著.架構(gòu)之美[M].王海鵬,等,譯.北京:機(jī)械工業(yè)出版社,2010.
[2] (美)埃斯波西托,薩爾塔列洛,著.Microsoft .NET企業(yè)級應(yīng)用架構(gòu)設(shè)計(jì)[M].陳黎夫,譯.北京:人民郵電出版社,2010.