摘要:PHP是主流的Web開發語言之一,但是現有的PHP開發模式無結構化組織,將數據訪問代碼、邏輯處理代碼和表示代碼相互混合,帶來了諸多問題,已經不能滿足Web應用快速發展的需要。本文提出了一個MVC設計模式的PHP實現——FDF框架,給PHP開發者提供了一個Web應用程序框架,分離Web應用程序的數據、視圖和控制,實現Web應用程序的松散藕合,從而提高Web應用程序的開發效率、可靠性、可維護性和可擴展性。
關鍵詞:PHP 開發框架 MVC模式
1 概述
互聯網迅速發展對Web應用程序的開發效率、可靠性、可維護性和可擴展性提出了更高的要求。PHP具有直觀、易于上手,運行速度快,跨平臺,開放源代碼等優點[1][2],已經成為最重要的Web開發語言之一[3]。但是,現有的PHP開發模式將數據訪問代碼、邏輯處理代碼和表示代碼相互混合,無法滿足Web應用快速發展的需要。
MVC設計模式對于生成有組織的模塊化應用程序,是一種被證實了的有效的方法[4]。MVC設計模式可以將應用程序的數據(Model)、視圖(View)和控制(Controller)相互分離,使得表現層能夠從邏輯事務層分離出來,實現應用程序的松散的耦合,從而提高應用程序的開發效率、可靠性、可維護性和可擴展性。
2 框架的結構設計
2.1 框架體系結構
本框架采用五層B/S架構的MVC模式,web層對應視圖和控制器,業務邏輯層和數據持久層由模型實現。模型(model)包括業務邏輯層和數據持久層,可分離業務邏輯和數據訪問邏輯,并對業務邏輯層隱藏了數據庫平臺,使得各層功能簡潔專一。
控制器(controller)包括前端控制器和動作控制器兩部分,前端控制器是框架的唯一入口,用來決定下一個動作的實施,而動作控制器處理完整的請求并調用相應的模型生成可供view使用的數據。
視圖(view)包括顯示邏輯和模板兩部分,負責解析顯示模板生成特定的用戶視圖。
2.2 框架運作流程
客戶端向服務器發出請求,服務器端使用唯一入口——前端控制器對用戶的request進行Mapping,找到與用戶request對應的action,動作控制器分析請求內容并調用適當的模型進行業務邏輯處理和數據訪問,把處理結果發送到視圖層,由視圖層加載視圖模板,處理顯示邏輯并經前端控制器響應給用戶。
3 框架的實現
3.1 視圖技術
視圖的關鍵是使用模板技術分離PHP代碼和HTML代碼[5]。在模板文件中將需要動態顯示的內容定義成某種形式的變量,視圖層處理完顯示邏輯后將數據發送給模板解析引擎,替換模板變量生成最終的用戶視圖。
當Web服務器接到URL請求后,首先判斷是否是第一次請求該URL。如果是,調用模板接口,交由模板解析引擎編譯該URL所需的模板和代碼文件,生成用戶視圖并輸出;否則直接定位到已經存在的用戶視圖上。這樣除了第一次編譯成本比較高之外,其他的訪問請求則省去了大量的重新解析和讀取時間??蚣苓€具有頁面緩存技術[6]可以將頁面生成靜態緩存,使程序運行速度和效率得到更大的提高。
3.2 控制器設計
控制器負責接受用戶請求、更新模型,以及選擇合適的視圖返回給用戶。控制器有助于將模型層和視圖層分離,從而在同一個模型的基礎上開發多種類型的視圖。
框架將控制器設計為兩部分,前端控制器和動作控制器。前端控制器主要負責分析用戶請求,并將用戶請求轉發給適當的動作控制器處理。動作控制器主要負責調用適當的模型生成供視圖使用的數據。
前端控制器index.php是框架的唯一入口,通過配置Apache服務器的rewrite引擎可以確保所有的頁面請求均傳到前端控制器,從而實現框架的集中控制。因此,除分析轉發用戶請求外,前端控制器還可以很方便地實現認證(authorization)、日志(logging)和數據驗證(validation)等功能。其關鍵代碼如下所示:
…
$action = $bd->make('ev',$bd)->get(HH);// 獲取頁面參數
if(!$action)$action = 'index';// 默認控制器
if(file_exists(CA.$dir.$action.'.action.php')) {//檢查控制器是否存在
if($action != 'index')include CA.$dir.$action.'.action.php';// 加載動作控制器
return new $action($bd);// 返回動作控制器實例
}
…
動作控制器是客戶請求和業務邏輯處理之間的一個適配器,將請求與業務邏輯分開。動作控制器由一組*.action.php文件實現,所有動作控制器均派生自抽象類ActionControllerBase,其抽象方法display()用于向視圖傳送數據。
Abstract class ActionControllerBase{
public $bd;
public $lang;
public function __construct($bd){
//…
}
// …
Abstract function display();
}
3.3 數據操作
PHP支持的數據庫極其廣泛,然而PHP提供的數據庫接口支持不統一[7]??蚣懿捎肞DO(PHP Data Object)作為數據庫操作抽象層的基礎,以增強程序代碼的可移植性。PDO旨在為多數關系數據庫API中的通用功能提供一致的API。這大大簡化了PHP程序(通過封裝差別,在一個通用的API下支持不同的數據庫)的開發。
框架還對常用數據庫操作如SELECT,INSERT,UPDATE,DELETE等進行了簡單封裝,使得數據庫操作進一步簡單化,開發者可以無需考慮SQL語句的具體的語法,而僅僅需要參考自己需要操作的數據庫表,以及所需要操作的數據庫的字段。這樣開發者可以將更多的精力放在考慮業務邏輯上,而不是考慮SQL的語法上。同時這樣的封裝還可以減少程序書寫中出錯的概率,也減少了調試中出錯的幾率。
4 總結
FDF框架是一種基于MVC模式的Web應用開發框架,它完成了用戶界面和業務邏輯的分離,為系統開發提供了基本的實現方法和清晰的設計框架。與傳統的開發方式相比,使用FDF框架開發的Web應用系統可以將模塊功能限制在局部范圍內,降低系統的耦合度,提高系統性能、可維護性和代碼的復用率,從而提高Web系統的開發效率。
參考文獻:
[1]Bisson S.,An introduction to PHP[J].Application Devel
opment Advisor,May 2002,6(4):38~41.
[2]Gamrat B.,PHP and preprocessed Web pages[J].Dr.Dobb’S Journal,January 2006,31(1):46~48.
[3]中國互聯網絡信息中心.第25次互聯網絡發展狀況統計報告[R].
[4]Hofmeister C.,Nord R.L.,Soni D.,Applied Software Architecture[M].Addison Wesley,2000.
[5]李滌.基于PHP的中文模板技術的研究[D].重慶大學,2004.
[6]蘇韶生,羅平.基于PHP技術的頁面緩存的實現[J].計算機時代,2005,55-56.
[7]張亞氫.基于PHP的通用數據庫接口技術的研究[D].重慶大學,2004.