東莞理工學校 張屹峰
對于早期的Web系統項目來說,最直接快捷的開發模式就是先設計好基于HTML的前端頁面,然后在此基礎上根據業務邏輯嵌入后端處理代碼。也就是說頁面展示與業務邏輯是密不可分的。這樣做對于簡單需求的中、小型Web系統項目來說,在某種程度上當然能夠降低開發的難度和成本,但隨著項目需求復雜程度的提高,這種開發模式顯然會造成開發效率的低下,維護成本的提高。因為前后端開發人員必須要相互兼顧彼此的業務邏輯,而前后端代碼的嵌套也直接造成了系統的高耦合,大量的冗余代碼片段造成系統的臃腫和難以維護。而MVC框架就很好的解決了這個問題。MVC的概念從上世紀七十年代就已經被提出,經過幾次演化后,在由SUN公司開發出JSP Model2中,對Web MVC進行了最早的實踐。
MVC即Mode(數據模型)-View(視圖)-Controller(控制器)。其中Controller是資源的調控中心,用于接受來自用戶的請求,調用View和Model的相關方法處理業務邏輯以便完成用戶的需求。Model專門用于數據的處理,直接與數據庫相關聯,它定義了對數據庫的相關操作,是Controller的數據來源。View是展示數據的相關頁面,它不關心數據的處理邏輯,只負責數據的呈現方式,通常是在HTML元素或模板標記語言中嵌入獲取的數據標記。多個View可以共享一個Model的數據,因而降低了代碼的冗余度。基本流程如圖1所示。

圖1 MVC基本流程
本文的Web項目系統基于PHP語言,采用MVC框架設計。這里僅以新聞管理、新聞展示功能模塊為例說明MVC框架在Web項目系統中的應用。為方便說明,暫且不考慮用戶登錄注冊等功能模塊。系統文件結構如圖2所示。

圖2 新聞管理功能模塊MVC框架文件結構
Model層直接和數據庫打交道,在Model層中針對數據庫中的表設計多個實體類,這些實體類與數據庫表是一對一的映射關系。例如,數據庫中的NEWS_TB表對應了Model層中的Newstb實體類。這樣做的好處是將數據庫表抽象出來,便于后期操作和管理,方便維護。而對于抽象出來的每一個實體類,都需要一個實體服務類與其對應,實體類與實體服務類也是一對一的映射關系。例如,Newstb實體類所對應的實體服務類為News_service類。實體服務類基于實體類創建實體對象$newstb_row,并為實體類對象提供了一系列操作數據庫的方法。Model層結構流程如圖3所示。

圖3 Model層結構流程
其中,實體類主要代碼片段如下:

實體服務類主要代碼片段如下:


Controller層利用Model層創建的實體服務類創建一個實體服務類對象$newsService,在Controller層的功能模塊中利用該服務類對象$newsService執行不同的方法完成相應的功能。View層作為展示內容的界面被包含到Controller層的相應文件中,為相關操作提供接口或數據錄入界面。Controller層和View層的結構流程如圖4所示。

圖4 Controller層和View層結構流程
以Controller層的getallnews.controller.php文件為例,其中的Getallnewscontroller類主要代碼片段如下:

在圖4中,可以看到系統設計了單一入口,也就是使用index.php文件處理所有的HTTP請求,無論是新聞列表頁還是新聞詳情頁。在入口文件中,我們還可以對url參數和POST數據進行必要的安全性檢查和特殊字符過濾、記錄日志、訪問統計等各種集中性任務處理,從而提高的系統的安全性,降低熊維護的成本和難度。主要代碼片段如下:

結束語:本文只是以新聞管理系統中的部分功能模塊為例,在基于PHP語言的基礎之上簡要分析了MVC框架的原理及設計流程。MVC框架以其低耦合性、高重用性以及較低的生命周期成本使得其應用越來越廣泛。利用MVC框架可以快速部署項目,極大的方便了軟件項目的工程化管理。但由于MVC框架增加了系統的結構和實現的復雜性,View層和Controller層關系緊密也從一定程度上造成了MVC框架使用的難度。因此,對于大型復雜需求的項目可以優先考慮使用MVC框架,對于中、小型項目建議還是不要使用。