閆曉亮, 焦素云
(長春工業(yè)大學 計算機科學與工程學院, 吉林 長春 130012)
MVC模式PHP開發(fā)框架
閆曉亮, 焦素云*
(長春工業(yè)大學 計算機科學與工程學院, 吉林 長春 130012)
分析了MVC設計模式的原理,闡述了框架的功能和設計思路,設計了框架的入口、模型層、視圖層、控制層等核心模塊,完成了一個基于MVC模式的PHP開發(fā)框架的設計。
設計模式; 開發(fā)框架; 模板引擎
當今世界處于信息化時代,人們對于信息的需求日漸多樣化。企業(yè)需要先于競爭對手發(fā)布信息,商家需要盡早的獲取有用信息,能否高效的掌控信息成為事業(yè)興衰的關鍵。Web系統(tǒng)作為信息發(fā)布的平臺,越來越受到各類企業(yè)的青睞。企業(yè)如能快速地開發(fā)出適合自己業(yè)務類型的Web系統(tǒng),及時地把商業(yè)信息發(fā)布出去,就能占據(jù)信息的制高點,更容易獲取成功。因此,快速的軟件開發(fā)對于企業(yè)發(fā)展來說十分重要。
在軟件開發(fā)領域,項目的快速完成離不開框架,然而由于種種原因,PHP沒有公認的比較完美的框架,雖然各種各樣的框架層出不窮,但是沒有一個能被普遍接受[1]。每個公司都有自己的業(yè)務需求,PHP程序員更加熱衷于實現(xiàn)一個屬于自己的框架來搭建Web應用系統(tǒng),以滿足自己特殊的需求。
軟件設計模式是近年來興起的一個概念,它指的是那些被反復使用、成熟可靠的軟件設計思想,使用該模式可以方便快捷地構建出滿足自己需求的應用軟件[2]。MVC設計模式在軟件開發(fā)中為廣大的程序員所接受,因為它能更好地描述和表示現(xiàn)實世界。文中將基于MVC模式設計一個用于進行Web開發(fā)的PHP框架,框架的名字為SprwPHP。
MVC是3個英文單詞的縮寫,“M”代表“Model”,是“模型”的意思,“V”代表“View”,是“視圖”的意思,“C”代表“Controller”,是“控制器”的意思。MVC模式即指“模型-視圖-控制器”設計模式,它把一個應用的輸入、處理、輸出分成相互分離的三層,便于理解和控制,也便于相互獨立的開發(fā)[3]。MVC模式原理如圖1所示。
圖1 MVC模式原理圖
1.1 模型
模型是具體用來處理用戶請求的部分。視圖和用戶進行交互,實質是接受用戶的請求,并把這種請求轉化為特定的數(shù)據(jù)流或狀態(tài),然后由控制器把該數(shù)據(jù)流或狀態(tài)路由給相應的模型,模型再對它進行相應的加工和處理,模型定義了處理這些數(shù)據(jù)流的規(guī)則和邏輯操作集合。模型的運作是暗箱模式,對用戶來說是完全透明的,用戶只需要通過視圖告訴系統(tǒng)“我要干什么”即可,具體的操作部分由模型來完成[4]。在抽取應用模型的時候,抽象的級別很重要,不能太高也不能太低。如果抽象的級別太高,在實現(xiàn)的時候過于復雜,需要再具體考慮很多額外情況;如果抽象級別太低,則僅能完成特定的功能,沒有冗余能力。合適的抽象級別應當根據(jù)具體的應用情況來定,適合自己應用的抽象級別就是最好的。比如“老板給員工布置任務”這個情景中,老板“把A任務完成”這條命令就相當于MVC模式當中視圖部分的數(shù)據(jù)流,員工B相當于模型,用來完成老板布置的任務。如果抽象級別高,員工B需要想很多種不同的辦法來應對老板的命令;如果抽象級別低,員工B只需要任意一種辦法來應對老板的命令。在安全性要求高的領域,模型的抽象級別應該高一些,以適應各種不同的突發(fā)情況。
1.2 視圖
視圖,顧名思義就是指用戶所能看到的東西。在應用系統(tǒng)當中,指的是用戶看到的系統(tǒng)界面,用戶可以通過該界面獲取自己想要的信息,并且可以通過它和系統(tǒng)進行交互。在Web開發(fā)領域,特指HTML等前端技術制作的界面[5],在PHP開發(fā)中也可以理解為Smarty模板。如今的應用需求越來越復雜,Web系統(tǒng)所處理信息的規(guī)模越來越大,對于視圖界面的要求也越來越高,但從技術的角度來說,視圖的本質只是用來顯示和接受數(shù)據(jù)。對于具體數(shù)據(jù)的處理操作由模型部分來完成。比如,圖書館查詢機的視圖,只接受讀者的查詢指令并將結果顯示給讀者,具體的查詢流程和操作則是由控制器將指令傳遞給模型,再由模型來完成復雜的查詢操作。
1.3 控制器
控制器即用來進行控制,它在視圖和模型之間起到橋梁的作用,對視圖和模型之間來回的數(shù)據(jù)進行選擇分發(fā)操作[6]。視圖接收用戶交互所產生的數(shù)據(jù),但不對數(shù)據(jù)進行處理,它只是把數(shù)據(jù)傳遞給控制器,由控制器選擇特定的模型來處理數(shù)據(jù),當模型將數(shù)據(jù)處理完畢之后,再通過控制器選擇相應的視圖將處理結果顯示給用戶。
2.1 框架的功能分析
開發(fā)框架的首要目的是為了進行快速軟件開發(fā),縮短軟件研發(fā)的周期。因此,框架集合了一般項目開發(fā)中必須的部件,這些部件在不同的項目中重用性很高。做個比喻,如果把軟件開發(fā)比作蓋房子,那么框架則相當于建筑的毛坯房,而框架提供了很多建筑通用的零件,結合設計圖紙,開發(fā)者可以迅速建造出一套合乎心意的房子出來。
文中設計的SprwPHP框架是采用了面向對象的思想并基于MVC模式。SprwPHP包含了作為開發(fā)框架應有的基本功能,框架的入口采用單點接入模式;設計了簡潔明了的目錄結構,包含常用的類,支持擴展類,能夠對URL進行處理,對用戶的輸入進行處理,也能對各種錯誤和異常進行處理。
2.2 框架的設計思路
剛入門的開發(fā)人員會認為框架的設計是一個很復雜的過程,其實,在熟練掌握了面向對象的思想及MVC設計模式之后,結合框架工作的基本原理,設計一個簡單實用的框架將變得容易起來,一圖勝百語,我們在功能分析的基礎上,設計了SprwPHP框架的組成結構,如圖2所示。
圖2 框架的組成結構
3.1 框架入口設計
系統(tǒng)的入口模式分為單一入口和多入口兩種。在動態(tài)Web系統(tǒng)流行之前,以網站為主的Web系統(tǒng)是由許多獨立的文件和頁面組成的,稱之為靜態(tài)系統(tǒng),當時的系統(tǒng)接入大多采用多點接入方式,要訪問某個特定的文件或頁面,直接通過URL定位到文件所在的位置即可[7]。該方式在應用日益復雜的當下已經不再流行,如今的Web系統(tǒng)包含的信息量巨大,需要統(tǒng)一的管理和優(yōu)化,多入口的模式無法做到這一點,而且多接口會暴露出不必讓用戶了解的系統(tǒng)信息,這些信息如果被用意不純的人獲取,可能會給系統(tǒng)帶來很大的危害。單一入口則會將所有的用戶請求rewrite到同一個文件,通常是腳本文件,由該文件接受用戶的所有請求,這些請求再被傳遞到控制層。采用單一入口有很多優(yōu)點,它使系統(tǒng)的權限驗證更加方便,不必每個文件進行單獨驗證,提高了驗證的效率;它還能使URL的重寫變得容易,重寫URL之后,只需針對入口文件編寫幾條規(guī)則,不用再針對其他的腳本文件編寫規(guī)則;另外,由于只有一個入口,因此能夠對系統(tǒng)進行統(tǒng)一的管理。SprwPHP框架的入口采用單一入口模式,設計示意如圖3所示。
圖3 框架入口設計
3.2 模型層設計
模型是具體用來處理用戶請求的部分,對于動態(tài)的Web系統(tǒng)來說,指的是操作數(shù)據(jù)庫的接口部分,也可以把它作為功能輔助類,輔助控制器的工作。這部分的設計非常重要,包括3個重要部分:數(shù)據(jù)庫驅動的初始化、數(shù)據(jù)庫的CRUD操作以及映射數(shù)據(jù)表。SprwPHP框架的模型層采用三層架構的模式。為了支持多種數(shù)據(jù)庫以實現(xiàn)良好的擴展性和可移植性,本框架采用PDO套件,它支持主流的數(shù)據(jù)庫驅動。模型層設計如圖4所示。
圖4 模型層設計
3.3 視圖層設計
視圖即用戶所看到的界面,用戶可以通過視圖界面與系統(tǒng)進行交互,提交各種請求。傳統(tǒng)的PHP開發(fā)中,實現(xiàn)邏輯功能部分的PHP代碼嵌入在視圖部分的HTML代碼當中,兩者混合在一起,不便于系統(tǒng)的擴展和維護。要實現(xiàn)邏輯(PHP代碼)和表現(xiàn)(HTML代碼)的分離,需要使用模板技術[8]。Smarty模板引擎是用PHP開發(fā)的模板引擎,如今已是PHP的標準模板引擎,使用它能夠使PHP程序員和美工人員各自獨立工作,美工人員改變視圖不會影響到程序的邏輯內容,反之亦然,可以很好地解決上述問題。在團隊合作的項目中,這一需求相當重要,因此,在視圖層,SprwPHP框架選擇Smarty作為模板引擎?;谝陨戏治?,設計了視圖層的處理流程如圖5所示。
圖5 視圖層的處理流程
由圖中可見,用戶向Web系統(tǒng)發(fā)送頁面請求,系統(tǒng)首先判斷視圖層中是否存在生存期內的緩存頁面,如果存在,則將此頁面響應給用戶;如果不存在,則判斷是否有編譯好的模板,再檢查該模板是否更新,執(zhí)行最新編譯的模板,輸出響應頁面給用戶;如果也沒有編譯好的模板,則調用數(shù)據(jù)結合HTML框架編譯出一個新的編譯模板文件,再執(zhí)行編譯好的模板文件,生成響應頁面給用戶。
3.4 控制層設計
控制器的設計非常關鍵,它在視圖和模型之間起到橋梁作用,該層需要完成配置文件的讀取、函數(shù)庫的加載、框架核心加載等初始化工作。相對于模型層封裝數(shù)據(jù)處理邏輯,控制層封裝的則是業(yè)務邏輯。由于SprwPHP框架在系統(tǒng)入口處采用的是單一入口模式,用戶的各種不同的數(shù)據(jù)請求需要經過同一個入口進入,因此,在控制層應該設計路由模塊,針對用戶的不同請求選擇不同的控制器,再由控制器選擇模型來處理用戶的請求,在相關的模型處理完數(shù)據(jù)后,控制器還需要選擇視圖將響應數(shù)據(jù)輸出給用戶。
基于以上分析,設計出SprwPHP框架控制層的處理流程,如圖6所示。
圖6 控制層處理流程
3.5 其他模塊的設計
完成了框架核心部分的設計之后,還需對框架的一些重要模塊進行設計。主要包括常用工具類的設計、緩存的設計和框架的目錄結構。
SprwPHP框架集成的常用工具類有:字符串處理類、圖像處理類、文件上傳類、錯誤和異常處理類、輸入控制類等,都是項目開發(fā)過程中使用頻率很高的類,將它們以相對獨立的方式集成在框架之中,可以為各個模塊調用,使用這些類可以提高項目開發(fā)的速度和質量。為了提高擴展性,框架還允許使用者自定義擴展類。
在緩存設計方面,本框架提供了兩種緩存機制:文件緩存和內存緩存,它們能夠一起使用。文件緩存依靠Smarty的緩存機制實現(xiàn),利用Smarty模板引擎生成靜態(tài)頁面,不必每次都從數(shù)據(jù)庫中提取數(shù)據(jù),從而達到緩存的效果;內存緩存則是基于Memcache,這是一個開源的內存對象緩存系統(tǒng),使用它可以將數(shù)據(jù)表的結果集以及訪問系統(tǒng)時的Session信息緩存在Server端的內存當中[9]。使用這兩種緩存機制能夠提升系統(tǒng)的整體性能。
為了便于框架的學習和使用,SprwPHP的目錄結構設計力求簡單明了??蚣苁褂胹prw.php作為公共入口文件;cores目錄用來存放框架的核心類;exclasses目錄用來存放框架的擴展類;commons目錄用來存放框架的通用資源和公共函數(shù);libs目錄則用來存放Smarty模板引擎的源文件。
原生態(tài)的PHP開發(fā),把代碼夾雜在HTML頁面當中,這在信息更新、變化迅速無比的今天是不合時宜的。文中設計的SprwPHP是基于MVC模式的PHP開發(fā)框架,使用該框架進行Web項目的開發(fā)能夠輕易地將系統(tǒng)的業(yè)務邏輯和顯示界面進行分離,美工人員和程序人員能夠各自獨立地開展工作,這使得系統(tǒng)的開發(fā)效率得以提升。通過將功能模塊限制在各自的范圍之內,系統(tǒng)的耦合度得以降低;緩存機制的使用使系統(tǒng)的性能大大增強[10]。另外,該框架集成了Web開發(fā)中經常使用的功能類和常用函數(shù)庫,提升了代碼的重用率和系統(tǒng)的可維護性。隨著技術的發(fā)展,各種新興的設計模式也不斷出現(xiàn),能否把最新的技術特性和模式引入到框架系統(tǒng)的設計中,這是下一步研究的方向。
[1] 張超.基于PHP的Web開發(fā)框架的設計與實現(xiàn)[D].沈陽:東北大學,2013.
[2] 李開涌.PHP MVC開發(fā)實戰(zhàn)[M].北京:機械工業(yè)出版社,2013.
[3] 佚名.MVC模式[EB/OL].(2015-04-22)[2016-03-10].http:// baike.haosou.com/doc/5411388.html.
[4] 崔偉.基于MVC設計模式的PHP快速開發(fā)框架研究與實現(xiàn)[D].西安:西北農林科技大學,2010.
[5] 胡晶,董航.HTML5核心Wed技術分析[J].長春工業(yè)大學學報:自然科學版,2013,34(6):587-590.
[6] 桑德.Learning PHP設計模式[M].北京:中國電力出版社,2014.
[7] 王志勇.基于RIA和MVC的PHP開發(fā)框架的研究與實現(xiàn)[D].成都:電子科技大學,2012.
[8] 高洛峰.細說PHP[M].2版.北京:電子工業(yè)出版社,2012.
[9] 呂志強.基于MVC模式的PHP框架設計[J].科技視界,2013(24):65-66.
[10] 崔偉,胥立,黃林.PHP開發(fā)框架關鍵技術分析[J].計算機光盤軟件與應用,2012(20):229-230.
PHP development framework based on MVC pattern
YAN Xiaoliang, JIAO Suyun*
(School of Computer Science & Engineering, Changchun University of Technology, Changchun 130012, China)
MVC design pattern is analyzed, and framework functions and design ideas are discussed. We design the entrance of the framework, model layer, view layer, controller layer and other core modules to fulfill the design of MVC pattern based PHP development framework.
design pattern; development framework; template engine.
2016-03-10
閆曉亮(1989-),男,漢族,河南洛陽人,長春工業(yè)大學碩士研究生,主要從事網絡安全方向研究,E-mail:shulijian@yeah.cn. *通訊作者:焦素云(1969-),女,漢族,吉林長春人,長春工業(yè)大學副教授,博士,主要從事系統(tǒng)結構方向研究,E-mail:jiaosuyun@ccut.edu.cn.
10.15923/j.cnki.cn22-1382/t.2016.6.15
TP 311.52
A
1674-1374(2016)06-0592-05