余楊奎
摘 要:計算機(jī)網(wǎng)絡(luò)迅速發(fā)展,Web成為人們?nèi)粘I钪幸粋€重要平臺,在網(wǎng)站上人們除了可以獲得諸多最新資訊,還可以在線購物、投資理財以及檔案管理等;企業(yè)也對Web系統(tǒng)更加依賴,因而web系統(tǒng)的開發(fā)備受人們關(guān)注,而PHP在Web開發(fā)中占據(jù)著重要地位。目前,傳統(tǒng)的php開發(fā)模式把數(shù)據(jù)層代碼、HTML表示層代碼混合,無法適應(yīng)系統(tǒng)開發(fā)的需求。本文結(jié)合信融天下互聯(lián)網(wǎng)金融P2P網(wǎng)貸系統(tǒng)和湛江電大學(xué)生干部數(shù)字化檔案系統(tǒng)的實現(xiàn),對基于MVC設(shè)計模式的PHP實現(xiàn)—THINKPHP框架建設(shè)和改進(jìn),可以為PHP的開發(fā)提供了一個Web的應(yīng)用程序框架,從開發(fā)框架上將Web應(yīng)用程序進(jìn)行分離,即表示層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層代碼完全分開,并且可以在框架上為數(shù)據(jù)訪問設(shè)置模型,提高了Web應(yīng)用程序開發(fā)效率,使其可靠性、可擴(kuò)展性、可維護(hù)性等特點得到增強。關(guān)鍵詞:MVC設(shè)計模式;PHP;開發(fā)框架
0 引言
隨著互聯(lián)網(wǎng)迅猛發(fā)展,使得動態(tài)網(wǎng)站建設(shè)要求更高,在網(wǎng)站開發(fā)方式上傳統(tǒng)的模式已經(jīng)無法滿足人們的需要,MVC模式對這個問題進(jìn)行來了很好的解決[1]。MVC作為一種開發(fā)模式在解決大型Web項目問題上發(fā)揮了重要作用。PHP是一種專業(yè)的網(wǎng)站的開發(fā)語言,然而現(xiàn)有的PHP開發(fā)模式尚未有成熟、統(tǒng)一的規(guī)范,系統(tǒng)水平的高低取決于開發(fā)人員的專業(yè)素質(zhì)及經(jīng)驗等,已經(jīng)無法滿足人們在開發(fā)效率、可擴(kuò)展性、可靠性及可維護(hù)性等方面快速房展的需求[2]。因而把框架機(jī)制引入PHP的開發(fā)成為人們關(guān)注的重點。
1 MVC設(shè)計模式
1.1 MVC設(shè)計模式在Web中的應(yīng)用
MVC(Model-View-Controller)把數(shù)據(jù)處理、數(shù)據(jù)表示及程序輸入輸出控制進(jìn)行分離,對不同部分對象間的通信方式進(jìn)行了描述,使其不受其它數(shù)據(jù)模型及其方法的影響,從而讓程序結(jié)構(gòu)更加清晰并具有靈活性[3]。MVC把應(yīng)用程序的輸入、輸出、處理強行分離,MVC的應(yīng)用程序分為模型、控制器及視圖三個部件[4]。MVC組件的功能及關(guān)系如圖1所示。
Web應(yīng)用程序從傳統(tǒng)意義上來說一般都是由ASP/PHP進(jìn)行創(chuàng)建的。它們把數(shù)據(jù)層代碼、HTML表示層代碼混合,即便開發(fā)者經(jīng)驗豐富、水平較高,從表示層把數(shù)據(jù)分離也具有一定的困難[5]。MVC把它們從根本上進(jìn)行了強制分離,雖然MVC的構(gòu)造工作量變大,但仍就有諸多優(yōu)點。其一,具有低耦合性。視圖層、業(yè)務(wù)層分離,視圖層代碼更改不需要對模型、控制器代碼進(jìn)行修改。同樣,改變業(yè)務(wù)流程或者規(guī)則只要對MVC的模型改動就可以,不需要更改視圖層代碼。模型和控制器、視圖是分離的,因而應(yīng)用程序的數(shù)據(jù)層及業(yè)務(wù)規(guī)則改變十分容易。其二,具有高重用性、可適用性。科學(xué)技術(shù)水平不斷提高,訪問應(yīng)用程序的方式變得多種多樣。同樣一個服務(wù)器端的代碼MVC模式可以讓多種視圖進(jìn)行訪問如Web瀏覽器等。模式只能夠?qū)?shù)據(jù)未格式化的部分進(jìn)行返回,因而為不同界面的使用提供了便利。其三,具有快速開發(fā)的能力,MVC模式可以讓界面設(shè)計人員對表現(xiàn)形式更加關(guān)注,程序員對開發(fā)業(yè)務(wù)邏輯更加重視,使系統(tǒng)的前端、后端同時開發(fā),使系統(tǒng)開發(fā)時間大為縮短。其四,具有可維護(hù)性。視圖層、業(yè)務(wù)邏輯層進(jìn)行分離,使得它們之間聯(lián)系只能通過接口,任何部分內(nèi)部都不會對其他部分產(chǎn)生影響,從而使Web應(yīng)用具有可維護(hù)性。其五,為軟件工程化管理提供了便利。不同層可各司其職,一個層面的應(yīng)用不同但也有某些相同特征,為軟件工程化管理提供了便利。
1.2 MVC設(shè)計模式的PHP實現(xiàn)
PHP對象在服務(wù)器端不能跨頁面存在,所有PHP實際上是沒有辦法實現(xiàn)傳統(tǒng)的MVC架構(gòu)的,其問題主要在模型上得到體現(xiàn),如在Java中,數(shù)據(jù)模型是獨立的,不同于業(yè)務(wù)邏輯、表現(xiàn)邏輯等,它可以在服務(wù)器端跨頁面存在,JavaBean 就是在這個方面發(fā)揮作用[6]。PHP進(jìn)程在內(nèi)存中不能長期存在,只能在PHP頁面剛剛執(zhí)行時創(chuàng)建,頁面執(zhí)行結(jié)束,則該進(jìn)程已經(jīng)結(jié)束,基于這種情況,模型不能進(jìn)行直接實現(xiàn)。
因PHP語言跨頁面無法存在,PHP開發(fā)框架中使用被動MVC更為適合。在被動MVC模式上,模型身處MVC結(jié)構(gòu)下卻不知。也就是說模型是一個普通的對象,和MVC中的其他部分是沒有關(guān)聯(lián)的。這樣的話,模型就不用再跨頁面存在,改變了使用MVC導(dǎo)致的效率低下現(xiàn)象。
被動MVC模式和傳統(tǒng)意義上的主動MVC模式不同,模型是一個簡單的獨立的對象,因而自身的改變不能傳達(dá)給視圖;視圖也無法對模型的更新作出訂閱及監(jiān)視等。視圖只能夠?qū)刂破鱾魉偷臄?shù)據(jù)進(jìn)行使用或者在得到控制器通知之后再去模型進(jìn)行最新數(shù)據(jù)的提取。所以被動MVC模式下,控制器還要把模型更新之后的數(shù)據(jù)傳送給視圖,因而在設(shè)計上相較于主動MVC更加困難。
2 基于MVC設(shè)計模式的開發(fā)框架建設(shè)與改進(jìn)
2.1 框架入口設(shè)計
傳統(tǒng)的Web應(yīng)用程序中,一般是以頁面或者文件為基礎(chǔ)的,接入模式一般采取多點接入。這種接入模式可以讓用戶對系統(tǒng)的文件進(jìn)行直接訪問,并且這些文件可以對用戶的請求進(jìn)行處理并把這些處理的結(jié)果反應(yīng)給用戶[7]。一個系統(tǒng)請求入口就有很多。這種接入方式給用戶顯示的接口非常多,容易帶來安全隱患,對全局的處理、優(yōu)化等起了不利影響。
在MVC設(shè)計模式上實現(xiàn)的THINKPHP框架,可以實現(xiàn)傳統(tǒng)的多點接入模式,同樣也可以進(jìn)行配置,設(shè)置成為單點接入模式。
單點接入模式把Web應(yīng)用應(yīng)用程序的全部請求都集中到一個腳本文件即所有的HTTP請求都由入口文件統(tǒng)一進(jìn)行接受。用戶和系統(tǒng)進(jìn)行交互的入口只有這一個。這種接入模式具有許多優(yōu)點,其一,方便全局處理,如對數(shù)據(jù)進(jìn)行安全監(jiān)測等。其二,可以使程序結(jié)構(gòu)更加清晰,方便進(jìn)行管理。入口進(jìn)行集中控制,程序人員只需要負(fù)責(zé)開發(fā)自己的模塊就可以,們不需要對程序運行進(jìn)行協(xié)調(diào)。其三,保證安全,采用單點入口模式,只開放需要開放的模塊,模塊的訪問地址都是同一個php文件,用戶難以辨別,可以保證系統(tǒng)的安全性。另外,單點接入也使系統(tǒng)的一些耦合缺陷不對用戶進(jìn)行開放。相對于多點接入模式來講,多點模式采用不同的php文件訪問web,URL相對簡單整潔,但是不方便同一控制,即便可以使用公用配置文件,倘若項目太大,公用配置也不是好的解決方案。
2.2 控制器設(shè)計
在MVC設(shè)計模式中,控制器主要作用是負(fù)責(zé)接受用戶輸入的數(shù)據(jù)并調(diào)用模型和視圖功能去完成用戶提出的需求。當(dāng)用戶通過web頁面中的超鏈接和發(fā)送HTML表單時,控制器本身不做任何處理,也不會輸出任何東西。它只接受請求并決定調(diào)用哪個模型構(gòu)件去處理請求,然后決定用哪個視圖來顯示模型處理返回的結(jié)果[8]。
THINKPHP的控制器層由核心控制器和業(yè)務(wù)控制器組成,核心控制器由系統(tǒng)內(nèi)部的App類完成,負(fù)責(zé)應(yīng)用(包括模塊和操作)的調(diào)度控制,包括HTTP請求攔截和轉(zhuǎn)發(fā)、加載配置等;業(yè)務(wù)控制器則由用戶定義的Action類或者其他控制器類完成。關(guān)鍵代碼如下:
…
if(defined('GROUP_NAME')){
if(is_file(CONF_PATH.GROUP_NAME.'/config.php'))
C(include CONF_PATH.GROUP_NAME.'/config.php');// 加載分組配置文件
if(is_file(COMMON_PATH.GROUP_NAME.'/function.php'))
include COMMON_PATH.GROUP_NAME.'/function.php';// 加載分組函數(shù)文件
}
…
業(yè)務(wù)控制器把客戶請求和業(yè)務(wù)邏輯分開,業(yè)務(wù)控制器是由用戶自定義的Action.php文件來實現(xiàn)的,業(yè)務(wù)控制器全部由Action類派生而來,繼承了所有Action類的方法,把數(shù)據(jù)傳送給視圖的抽象方法是$this->display。關(guān)鍵代碼如下:
…
class Abstract extends Action {
public function index(){
$this->display();
}
}
…
2.3 數(shù)據(jù)操作
PHP支持的數(shù)據(jù)庫眾多,典型的數(shù)據(jù)庫就是 MySql,對于接口支持不具有統(tǒng)一性[9]。
THINKPHP框架對數(shù)據(jù)庫增刪改操作進(jìn)行了封裝,簡化了數(shù)據(jù)庫操作,使得開發(fā)人員不需要學(xué)習(xí)SQL語句的相關(guān)語法,只需使用GetLastSql()指令將需要操作的SQL語句輸出到瀏覽器調(diào)整即可。開發(fā)人員可以有更多的精力用在系統(tǒng)業(yè)務(wù)邏輯上,不再考慮SQL的語法。進(jìn)行簡單封裝還降低的程序的書寫錯誤,降低了調(diào)試出錯概率。
2.4 視圖技術(shù)
在THINKPHP中,利用視圖模板技術(shù)把數(shù)據(jù)層、HTML表示層代碼進(jìn)行分離。Web服務(wù)器接收URL請求之后,首先需要確認(rèn)的是不是第一次對URL進(jìn)行請求,第一次請求的URL,首先對模板進(jìn)行調(diào)用,判斷模版主題,然后再由控制器代碼等進(jìn)行編譯,最后用戶視圖生成數(shù)據(jù)并輸出;不是第一次則在已具有的用戶視圖上進(jìn)行直接定位,也要判斷模版主題,這種請求節(jié)省解析以及讀取的時間。框架會使系統(tǒng)偽靜態(tài)化,考慮使用rewrite篩選器完成。加快了程序的運行速度,提高了效率。關(guān)鍵代碼如下:
function isMobile() {
// 如果有HTTP_X_WAP_PROFILE則一定是移動設(shè)備
if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])){
return true;
}
return false;
}
$info=isMobile();
if($info){ $theme = 'phone'; //手機(jī)模板
}else{$theme = 'default'; //默認(rèn)模板
}
3 結(jié)語
社會不斷進(jìn)步,互聯(lián)網(wǎng)在全球范圍內(nèi)普及,網(wǎng)絡(luò)應(yīng)用開發(fā)技術(shù)發(fā)展迅猛,Web應(yīng)用在人們的生活、工作中產(chǎn)生了較大的影響,許多的信息、數(shù)據(jù)庫系統(tǒng)等逐漸轉(zhuǎn)移到互聯(lián)網(wǎng)。人們?nèi)粘I詈蚖eb應(yīng)用緊密相關(guān)。但目前Web應(yīng)用程序的開發(fā)已經(jīng)不能適應(yīng)Web應(yīng)用增強的需求,為了提高Web應(yīng)用程序的開發(fā)效率,并促使其可靠性、可擴(kuò)展性、可維護(hù)性的提高,Web應(yīng)用程序開發(fā)員引入了框架,提高了應(yīng)用程序開發(fā)的質(zhì)量和效率。本文結(jié)合信融天下互聯(lián)網(wǎng)金融P2P網(wǎng)貸系統(tǒng)和湛江電大學(xué)生干部數(shù)字化檔案系統(tǒng)的實現(xiàn),基于MVC設(shè)計模式對PHP快速開發(fā)框架進(jìn)行分析研究,提出了MVC設(shè)計模式的PHP實現(xiàn)即THINKPHP框架,THINKPHP框架把用戶界面、業(yè)務(wù)邏輯進(jìn)行強制分離,使系統(tǒng)開發(fā)設(shè)計框架更加清晰并為其提供了改進(jìn)方法。
本文系2015年度湛江市科學(xué)技術(shù)局重大科技專項“信融天下互聯(lián)網(wǎng)金融P2P網(wǎng)貸系統(tǒng)研發(fā)及平臺運營”(項目編號:15A102)、2015年度湛江市廣播電視大學(xué)系統(tǒng)科研項目“基于市級電大學(xué)生干部數(shù)字化檔案系統(tǒng)的研究”(立項編號:X201505)的階段性成果。