東莞理工學(xué)校 張屹峰
對(duì)于早期的Web系統(tǒng)項(xiàng)目來說,最直接快捷的開發(fā)模式就是先設(shè)計(jì)好基于HTML的前端頁(yè)面,然后在此基礎(chǔ)上根據(jù)業(yè)務(wù)邏輯嵌入后端處理代碼。也就是說頁(yè)面展示與業(yè)務(wù)邏輯是密不可分的。這樣做對(duì)于簡(jiǎn)單需求的中、小型Web系統(tǒng)項(xiàng)目來說,在某種程度上當(dāng)然能夠降低開發(fā)的難度和成本,但隨著項(xiàng)目需求復(fù)雜程度的提高,這種開發(fā)模式顯然會(huì)造成開發(fā)效率的低下,維護(hù)成本的提高。因?yàn)榍昂蠖碎_發(fā)人員必須要相互兼顧彼此的業(yè)務(wù)邏輯,而前后端代碼的嵌套也直接造成了系統(tǒng)的高耦合,大量的冗余代碼片段造成系統(tǒng)的臃腫和難以維護(hù)。而MVC框架就很好的解決了這個(gè)問題。MVC的概念從上世紀(jì)七十年代就已經(jīng)被提出,經(jīng)過幾次演化后,在由SUN公司開發(fā)出JSP Model2中,對(duì)Web MVC進(jìn)行了最早的實(shí)踐。
MVC即Mode(數(shù)據(jù)模型)-View(視圖)-Controller(控制器)。其中Controller是資源的調(diào)控中心,用于接受來自用戶的請(qǐng)求,調(diào)用View和Model的相關(guān)方法處理業(yè)務(wù)邏輯以便完成用戶的需求。Model專門用于數(shù)據(jù)的處理,直接與數(shù)據(jù)庫(kù)相關(guān)聯(lián),它定義了對(duì)數(shù)據(jù)庫(kù)的相關(guān)操作,是Controller的數(shù)據(jù)來源。View是展示數(shù)據(jù)的相關(guān)頁(yè)面,它不關(guān)心數(shù)據(jù)的處理邏輯,只負(fù)責(zé)數(shù)據(jù)的呈現(xiàn)方式,通常是在HTML元素或模板標(biāo)記語言中嵌入獲取的數(shù)據(jù)標(biāo)記。多個(gè)View可以共享一個(gè)Model的數(shù)據(jù),因而降低了代碼的冗余度?;玖鞒倘鐖D1所示。
圖1 MVC基本流程
本文的Web項(xiàng)目系統(tǒng)基于PHP語言,采用MVC框架設(shè)計(jì)。這里僅以新聞管理、新聞?wù)故竟δ苣K為例說明MVC框架在Web項(xiàng)目系統(tǒng)中的應(yīng)用。為方便說明,暫且不考慮用戶登錄注冊(cè)等功能模塊。系統(tǒng)文件結(jié)構(gòu)如圖2所示。
圖2 新聞管理功能模塊MVC框架文件結(jié)構(gòu)
Model層直接和數(shù)據(jù)庫(kù)打交道,在Model層中針對(duì)數(shù)據(jù)庫(kù)中的表設(shè)計(jì)多個(gè)實(shí)體類,這些實(shí)體類與數(shù)據(jù)庫(kù)表是一對(duì)一的映射關(guān)系。例如,數(shù)據(jù)庫(kù)中的NEWS_TB表對(duì)應(yīng)了Model層中的Newstb實(shí)體類。這樣做的好處是將數(shù)據(jù)庫(kù)表抽象出來,便于后期操作和管理,方便維護(hù)。而對(duì)于抽象出來的每一個(gè)實(shí)體類,都需要一個(gè)實(shí)體服務(wù)類與其對(duì)應(yīng),實(shí)體類與實(shí)體服務(wù)類也是一對(duì)一的映射關(guān)系。例如,Newstb實(shí)體類所對(duì)應(yīng)的實(shí)體服務(wù)類為News_service類。實(shí)體服務(wù)類基于實(shí)體類創(chuàng)建實(shí)體對(duì)象$newstb_row,并為實(shí)體類對(duì)象提供了一系列操作數(shù)據(jù)庫(kù)的方法。Model層結(jié)構(gòu)流程如圖3所示。
圖3 Model層結(jié)構(gòu)流程
其中,實(shí)體類主要代碼片段如下:
實(shí)體服務(wù)類主要代碼片段如下:
Controller層利用Model層創(chuàng)建的實(shí)體服務(wù)類創(chuàng)建一個(gè)實(shí)體服務(wù)類對(duì)象$newsService,在Controller層的功能模塊中利用該服務(wù)類對(duì)象$newsService執(zhí)行不同的方法完成相應(yīng)的功能。View層作為展示內(nèi)容的界面被包含到Controller層的相應(yīng)文件中,為相關(guān)操作提供接口或數(shù)據(jù)錄入界面。Controller層和View層的結(jié)構(gòu)流程如圖4所示。
圖4 Controller層和View層結(jié)構(gòu)流程
以Controller層的getallnews.controller.php文件為例,其中的Getallnewscontroller類主要代碼片段如下:
在圖4中,可以看到系統(tǒng)設(shè)計(jì)了單一入口,也就是使用index.php文件處理所有的HTTP請(qǐng)求,無論是新聞列表頁(yè)還是新聞詳情頁(yè)。在入口文件中,我們還可以對(duì)url參數(shù)和POST數(shù)據(jù)進(jìn)行必要的安全性檢查和特殊字符過濾、記錄日志、訪問統(tǒng)計(jì)等各種集中性任務(wù)處理,從而提高的系統(tǒng)的安全性,降低熊維護(hù)的成本和難度。主要代碼片段如下:
結(jié)束語:本文只是以新聞管理系統(tǒng)中的部分功能模塊為例,在基于PHP語言的基礎(chǔ)之上簡(jiǎn)要分析了MVC框架的原理及設(shè)計(jì)流程。MVC框架以其低耦合性、高重用性以及較低的生命周期成本使得其應(yīng)用越來越廣泛。利用MVC框架可以快速部署項(xiàng)目,極大的方便了軟件項(xiàng)目的工程化管理。但由于MVC框架增加了系統(tǒng)的結(jié)構(gòu)和實(shí)現(xiàn)的復(fù)雜性,View層和Controller層關(guān)系緊密也從一定程度上造成了MVC框架使用的難度。因此,對(duì)于大型復(fù)雜需求的項(xiàng)目可以優(yōu)先考慮使用MVC框架,對(duì)于中、小型項(xiàng)目建議還是不要使用。