閆曉亮, 焦素云
(長春工業(yè)大學(xué) 計(jì)算機(jī)科學(xué)與工程學(xué)院, 吉林 長春 130012)
MVC模式PHP開發(fā)框架
閆曉亮, 焦素云*
(長春工業(yè)大學(xué) 計(jì)算機(jī)科學(xué)與工程學(xué)院, 吉林 長春 130012)
分析了MVC設(shè)計(jì)模式的原理,闡述了框架的功能和設(shè)計(jì)思路,設(shè)計(jì)了框架的入口、模型層、視圖層、控制層等核心模塊,完成了一個(gè)基于MVC模式的PHP開發(fā)框架的設(shè)計(jì)。
設(shè)計(jì)模式; 開發(fā)框架; 模板引擎
當(dāng)今世界處于信息化時(shí)代,人們對于信息的需求日漸多樣化。企業(yè)需要先于競爭對手發(fā)布信息,商家需要盡早的獲取有用信息,能否高效的掌控信息成為事業(yè)興衰的關(guān)鍵。Web系統(tǒng)作為信息發(fā)布的平臺,越來越受到各類企業(yè)的青睞。企業(yè)如能快速地開發(fā)出適合自己業(yè)務(wù)類型的Web系統(tǒng),及時(shí)地把商業(yè)信息發(fā)布出去,就能占據(jù)信息的制高點(diǎn),更容易獲取成功。因此,快速的軟件開發(fā)對于企業(yè)發(fā)展來說十分重要。
在軟件開發(fā)領(lǐng)域,項(xiàng)目的快速完成離不開框架,然而由于種種原因,PHP沒有公認(rèn)的比較完美的框架,雖然各種各樣的框架層出不窮,但是沒有一個(gè)能被普遍接受[1]。每個(gè)公司都有自己的業(yè)務(wù)需求,PHP程序員更加熱衷于實(shí)現(xiàn)一個(gè)屬于自己的框架來搭建Web應(yīng)用系統(tǒng),以滿足自己特殊的需求。
軟件設(shè)計(jì)模式是近年來興起的一個(gè)概念,它指的是那些被反復(fù)使用、成熟可靠的軟件設(shè)計(jì)思想,使用該模式可以方便快捷地構(gòu)建出滿足自己需求的應(yīng)用軟件[2]。MVC設(shè)計(jì)模式在軟件開發(fā)中為廣大的程序員所接受,因?yàn)樗芨玫孛枋龊捅硎粳F(xiàn)實(shí)世界。文中將基于MVC模式設(shè)計(jì)一個(gè)用于進(jìn)行Web開發(fā)的PHP框架,框架的名字為SprwPHP。
MVC是3個(gè)英文單詞的縮寫,“M”代表“Model”,是“模型”的意思,“V”代表“View”,是“視圖”的意思,“C”代表“Controller”,是“控制器”的意思。MVC模式即指“模型-視圖-控制器”設(shè)計(jì)模式,它把一個(gè)應(yīng)用的輸入、處理、輸出分成相互分離的三層,便于理解和控制,也便于相互獨(dú)立的開發(fā)[3]。MVC模式原理如圖1所示。

圖1 MVC模式原理圖
1.1 模型
模型是具體用來處理用戶請求的部分。視圖和用戶進(jìn)行交互,實(shí)質(zhì)是接受用戶的請求,并把這種請求轉(zhuǎn)化為特定的數(shù)據(jù)流或狀態(tài),然后由控制器把該數(shù)據(jù)流或狀態(tài)路由給相應(yīng)的模型,模型再對它進(jìn)行相應(yīng)的加工和處理,模型定義了處理這些數(shù)據(jù)流的規(guī)則和邏輯操作集合。模型的運(yùn)作是暗箱模式,對用戶來說是完全透明的,用戶只需要通過視圖告訴系統(tǒng)“我要干什么”即可,具體的操作部分由模型來完成[4]。在抽取應(yīng)用模型的時(shí)候,抽象的級別很重要,不能太高也不能太低。如果抽象的級別太高,在實(shí)現(xiàn)的時(shí)候過于復(fù)雜,需要再具體考慮很多額外情況;如果抽象級別太低,則僅能完成特定的功能,沒有冗余能力。合適的抽象級別應(yīng)當(dāng)根據(jù)具體的應(yīng)用情況來定,適合自己應(yīng)用的抽象級別就是最好的。比如“老板給員工布置任務(wù)”這個(gè)情景中,老板“把A任務(wù)完成”這條命令就相當(dāng)于MVC模式當(dāng)中視圖部分的數(shù)據(jù)流,員工B相當(dāng)于模型,用來完成老板布置的任務(wù)。如果抽象級別高,員工B需要想很多種不同的辦法來應(yīng)對老板的命令;如果抽象級別低,員工B只需要任意一種辦法來應(yīng)對老板的命令。在安全性要求高的領(lǐng)域,模型的抽象級別應(yīng)該高一些,以適應(yīng)各種不同的突發(fā)情況。
1.2 視圖
視圖,顧名思義就是指用戶所能看到的東西。在應(yīng)用系統(tǒng)當(dāng)中,指的是用戶看到的系統(tǒng)界面,用戶可以通過該界面獲取自己想要的信息,并且可以通過它和系統(tǒng)進(jìn)行交互。在Web開發(fā)領(lǐng)域,特指HTML等前端技術(shù)制作的界面[5],在PHP開發(fā)中也可以理解為Smarty模板。如今的應(yīng)用需求越來越復(fù)雜,Web系統(tǒng)所處理信息的規(guī)模越來越大,對于視圖界面的要求也越來越高,但從技術(shù)的角度來說,視圖的本質(zhì)只是用來顯示和接受數(shù)據(jù)。對于具體數(shù)據(jù)的處理操作由模型部分來完成。比如,圖書館查詢機(jī)的視圖,只接受讀者的查詢指令并將結(jié)果顯示給讀者,具體的查詢流程和操作則是由控制器將指令傳遞給模型,再由模型來完成復(fù)雜的查詢操作。
1.3 控制器
控制器即用來進(jìn)行控制,它在視圖和模型之間起到橋梁的作用,對視圖和模型之間來回的數(shù)據(jù)進(jìn)行選擇分發(fā)操作[6]。視圖接收用戶交互所產(chǎn)生的數(shù)據(jù),但不對數(shù)據(jù)進(jìn)行處理,它只是把數(shù)據(jù)傳遞給控制器,由控制器選擇特定的模型來處理數(shù)據(jù),當(dāng)模型將數(shù)據(jù)處理完畢之后,再通過控制器選擇相應(yīng)的視圖將處理結(jié)果顯示給用戶。
2.1 框架的功能分析
開發(fā)框架的首要目的是為了進(jìn)行快速軟件開發(fā),縮短軟件研發(fā)的周期。因此,框架集合了一般項(xiàng)目開發(fā)中必須的部件,這些部件在不同的項(xiàng)目中重用性很高。做個(gè)比喻,如果把軟件開發(fā)比作蓋房子,那么框架則相當(dāng)于建筑的毛坯房,而框架提供了很多建筑通用的零件,結(jié)合設(shè)計(jì)圖紙,開發(fā)者可以迅速建造出一套合乎心意的房子出來。
文中設(shè)計(jì)的SprwPHP框架是采用了面向?qū)ο蟮乃枷氩⒒贛VC模式。SprwPHP包含了作為開發(fā)框架應(yīng)有的基本功能,框架的入口采用單點(diǎn)接入模式;設(shè)計(jì)了簡潔明了的目錄結(jié)構(gòu),包含常用的類,支持?jǐn)U展類,能夠?qū)RL進(jìn)行處理,對用戶的輸入進(jìn)行處理,也能對各種錯誤和異常進(jìn)行處理。
2.2 框架的設(shè)計(jì)思路
剛?cè)腴T的開發(fā)人員會認(rèn)為框架的設(shè)計(jì)是一個(gè)很復(fù)雜的過程,其實(shí),在熟練掌握了面向?qū)ο蟮乃枷爰癕VC設(shè)計(jì)模式之后,結(jié)合框架工作的基本原理,設(shè)計(jì)一個(gè)簡單實(shí)用的框架將變得容易起來,一圖勝百語,我們在功能分析的基礎(chǔ)上,設(shè)計(jì)了SprwPHP框架的組成結(jié)構(gòu),如圖2所示。

圖2 框架的組成結(jié)構(gòu)
3.1 框架入口設(shè)計(jì)
系統(tǒng)的入口模式分為單一入口和多入口兩種。在動態(tài)Web系統(tǒng)流行之前,以網(wǎng)站為主的Web系統(tǒng)是由許多獨(dú)立的文件和頁面組成的,稱之為靜態(tài)系統(tǒng),當(dāng)時(shí)的系統(tǒng)接入大多采用多點(diǎn)接入方式,要訪問某個(gè)特定的文件或頁面,直接通過URL定位到文件所在的位置即可[7]。該方式在應(yīng)用日益復(fù)雜的當(dāng)下已經(jīng)不再流行,如今的Web系統(tǒng)包含的信息量巨大,需要統(tǒng)一的管理和優(yōu)化,多入口的模式無法做到這一點(diǎn),而且多接口會暴露出不必讓用戶了解的系統(tǒng)信息,這些信息如果被用意不純的人獲取,可能會給系統(tǒng)帶來很大的危害。單一入口則會將所有的用戶請求rewrite到同一個(gè)文件,通常是腳本文件,由該文件接受用戶的所有請求,這些請求再被傳遞到控制層。采用單一入口有很多優(yōu)點(diǎn),它使系統(tǒng)的權(quán)限驗(yàn)證更加方便,不必每個(gè)文件進(jìn)行單獨(dú)驗(yàn)證,提高了驗(yàn)證的效率;它還能使URL的重寫變得容易,重寫URL之后,只需針對入口文件編寫幾條規(guī)則,不用再針對其他的腳本文件編寫規(guī)則;另外,由于只有一個(gè)入口,因此能夠?qū)ο到y(tǒng)進(jìn)行統(tǒng)一的管理。SprwPHP框架的入口采用單一入口模式,設(shè)計(jì)示意如圖3所示。

圖3 框架入口設(shè)計(jì)
3.2 模型層設(shè)計(jì)
模型是具體用來處理用戶請求的部分,對于動態(tài)的Web系統(tǒng)來說,指的是操作數(shù)據(jù)庫的接口部分,也可以把它作為功能輔助類,輔助控制器的工作。這部分的設(shè)計(jì)非常重要,包括3個(gè)重要部分:數(shù)據(jù)庫驅(qū)動的初始化、數(shù)據(jù)庫的CRUD操作以及映射數(shù)據(jù)表。SprwPHP框架的模型層采用三層架構(gòu)的模式。為了支持多種數(shù)據(jù)庫以實(shí)現(xiàn)良好的擴(kuò)展性和可移植性,本框架采用PDO套件,它支持主流的數(shù)據(jù)庫驅(qū)動。模型層設(shè)計(jì)如圖4所示。

圖4 模型層設(shè)計(jì)
3.3 視圖層設(shè)計(jì)
視圖即用戶所看到的界面,用戶可以通過視圖界面與系統(tǒng)進(jìn)行交互,提交各種請求。傳統(tǒng)的PHP開發(fā)中,實(shí)現(xiàn)邏輯功能部分的PHP代碼嵌入在視圖部分的HTML代碼當(dāng)中,兩者混合在一起,不便于系統(tǒng)的擴(kuò)展和維護(hù)。要實(shí)現(xiàn)邏輯(PHP代碼)和表現(xiàn)(HTML代碼)的分離,需要使用模板技術(shù)[8]。Smarty模板引擎是用PHP開發(fā)的模板引擎,如今已是PHP的標(biāo)準(zhǔn)模板引擎,使用它能夠使PHP程序員和美工人員各自獨(dú)立工作,美工人員改變視圖不會影響到程序的邏輯內(nèi)容,反之亦然,可以很好地解決上述問題。在團(tuán)隊(duì)合作的項(xiàng)目中,這一需求相當(dāng)重要,因此,在視圖層,SprwPHP框架選擇Smarty作為模板引擎。基于以上分析,設(shè)計(jì)了視圖層的處理流程如圖5所示。

圖5 視圖層的處理流程
由圖中可見,用戶向Web系統(tǒng)發(fā)送頁面請求,系統(tǒng)首先判斷視圖層中是否存在生存期內(nèi)的緩存頁面,如果存在,則將此頁面響應(yīng)給用戶;如果不存在,則判斷是否有編譯好的模板,再檢查該模板是否更新,執(zhí)行最新編譯的模板,輸出響應(yīng)頁面給用戶;如果也沒有編譯好的模板,則調(diào)用數(shù)據(jù)結(jié)合HTML框架編譯出一個(gè)新的編譯模板文件,再執(zhí)行編譯好的模板文件,生成響應(yīng)頁面給用戶。
3.4 控制層設(shè)計(jì)
控制器的設(shè)計(jì)非常關(guān)鍵,它在視圖和模型之間起到橋梁作用,該層需要完成配置文件的讀取、函數(shù)庫的加載、框架核心加載等初始化工作。相對于模型層封裝數(shù)據(jù)處理邏輯,控制層封裝的則是業(yè)務(wù)邏輯。由于SprwPHP框架在系統(tǒng)入口處采用的是單一入口模式,用戶的各種不同的數(shù)據(jù)請求需要經(jīng)過同一個(gè)入口進(jìn)入,因此,在控制層應(yīng)該設(shè)計(jì)路由模塊,針對用戶的不同請求選擇不同的控制器,再由控制器選擇模型來處理用戶的請求,在相關(guān)的模型處理完數(shù)據(jù)后,控制器還需要選擇視圖將響應(yīng)數(shù)據(jù)輸出給用戶。
基于以上分析,設(shè)計(jì)出SprwPHP框架控制層的處理流程,如圖6所示。

圖6 控制層處理流程
3.5 其他模塊的設(shè)計(jì)
完成了框架核心部分的設(shè)計(jì)之后,還需對框架的一些重要模塊進(jìn)行設(shè)計(jì)。主要包括常用工具類的設(shè)計(jì)、緩存的設(shè)計(jì)和框架的目錄結(jié)構(gòu)。
SprwPHP框架集成的常用工具類有:字符串處理類、圖像處理類、文件上傳類、錯誤和異常處理類、輸入控制類等,都是項(xiàng)目開發(fā)過程中使用頻率很高的類,將它們以相對獨(dú)立的方式集成在框架之中,可以為各個(gè)模塊調(diào)用,使用這些類可以提高項(xiàng)目開發(fā)的速度和質(zhì)量。為了提高擴(kuò)展性,框架還允許使用者自定義擴(kuò)展類。
在緩存設(shè)計(jì)方面,本框架提供了兩種緩存機(jī)制:文件緩存和內(nèi)存緩存,它們能夠一起使用。文件緩存依靠Smarty的緩存機(jī)制實(shí)現(xiàn),利用Smarty模板引擎生成靜態(tài)頁面,不必每次都從數(shù)據(jù)庫中提取數(shù)據(jù),從而達(dá)到緩存的效果;內(nèi)存緩存則是基于Memcache,這是一個(gè)開源的內(nèi)存對象緩存系統(tǒng),使用它可以將數(shù)據(jù)表的結(jié)果集以及訪問系統(tǒng)時(shí)的Session信息緩存在Server端的內(nèi)存當(dāng)中[9]。使用這兩種緩存機(jī)制能夠提升系統(tǒng)的整體性能。
為了便于框架的學(xué)習(xí)和使用,SprwPHP的目錄結(jié)構(gòu)設(shè)計(jì)力求簡單明了。框架使用sprw.php作為公共入口文件;cores目錄用來存放框架的核心類;exclasses目錄用來存放框架的擴(kuò)展類;commons目錄用來存放框架的通用資源和公共函數(shù);libs目錄則用來存放Smarty模板引擎的源文件。
原生態(tài)的PHP開發(fā),把代碼夾雜在HTML頁面當(dāng)中,這在信息更新、變化迅速無比的今天是不合時(shí)宜的。文中設(shè)計(jì)的SprwPHP是基于MVC模式的PHP開發(fā)框架,使用該框架進(jìn)行Web項(xiàng)目的開發(fā)能夠輕易地將系統(tǒng)的業(yè)務(wù)邏輯和顯示界面進(jìn)行分離,美工人員和程序人員能夠各自獨(dú)立地開展工作,這使得系統(tǒng)的開發(fā)效率得以提升。通過將功能模塊限制在各自的范圍之內(nèi),系統(tǒng)的耦合度得以降低;緩存機(jī)制的使用使系統(tǒng)的性能大大增強(qiáng)[10]。另外,該框架集成了Web開發(fā)中經(jīng)常使用的功能類和常用函數(shù)庫,提升了代碼的重用率和系統(tǒng)的可維護(hù)性。隨著技術(shù)的發(fā)展,各種新興的設(shè)計(jì)模式也不斷出現(xiàn),能否把最新的技術(shù)特性和模式引入到框架系統(tǒng)的設(shè)計(jì)中,這是下一步研究的方向。
[1] 張超.基于PHP的Web開發(fā)框架的設(shè)計(jì)與實(shí)現(xiàn)[D].沈陽:東北大學(xué),2013.
[2] 李開涌.PHP MVC開發(fā)實(shí)戰(zhàn)[M].北京:機(jī)械工業(yè)出版社,2013.
[3] 佚名.MVC模式[EB/OL].(2015-04-22)[2016-03-10].http:// baike.haosou.com/doc/5411388.html.
[4] 崔偉.基于MVC設(shè)計(jì)模式的PHP快速開發(fā)框架研究與實(shí)現(xiàn)[D].西安:西北農(nóng)林科技大學(xué),2010.
[5] 胡晶,董航.HTML5核心Wed技術(shù)分析[J].長春工業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版,2013,34(6):587-590.
[6] 桑德.Learning PHP設(shè)計(jì)模式[M].北京:中國電力出版社,2014.
[7] 王志勇.基于RIA和MVC的PHP開發(fā)框架的研究與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2012.
[8] 高洛峰.細(xì)說PHP[M].2版.北京:電子工業(yè)出版社,2012.
[9] 呂志強(qiáng).基于MVC模式的PHP框架設(shè)計(jì)[J].科技視界,2013(24):65-66.
[10] 崔偉,胥立,黃林.PHP開發(fā)框架關(guān)鍵技術(shù)分析[J].計(jì)算機(jī)光盤軟件與應(yīng)用,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è)大學(xué)碩士研究生,主要從事網(wǎng)絡(luò)安全方向研究,E-mail:shulijian@yeah.cn. *通訊作者:焦素云(1969-),女,漢族,吉林長春人,長春工業(yè)大學(xué)副教授,博士,主要從事系統(tǒng)結(jié)構(gòu)方向研究,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