蔣先梅
(江蘇聯合職業技術學院徐州經貿分院,江蘇 徐州 221004)
PHP 即“超文本預處理器”,是一種開源的、免費使用的、運行在服務器端的腳本語言[1]。 PHP 吸納多個語言的優點,創造出自己獨特方便快速的語法風格。 PHP 支持面向過程和面向對象這兩種開發方式。PHP 和HTML 可以相互嵌入使用,修改快捷、簡易、實用性強、跨平臺性好、方便移植,在Web 系統開發領域中占據了重要的地位[1]。 MVC 是一種軟件開發模式,已廣泛流行于系統的開發與應用中。 隨著互聯網高速發展,Web 應用的功能需要也越來越復雜,MVC 在Web 開發領域也備受歡迎。
MVC 全稱ModelViewController,是一種軟件設計思想典范。 Model(數據模型)、View(視圖)、Controller(控制器)三大核心模塊在Web 系統起到至關重要的作用,分別處理各自范圍內的事情[1]。 數據模型只與數據庫有關系,只處理應用程序數據邏輯部分,數據庫的數據增刪改查在此模塊內實現。 視圖把從數據模型中獲取的數據,進行格式化展示到瀏覽器的前端頁面上。 控制器是整個系統的調度中心,統一協調各模塊之間的工作。 控制器經常從視圖中獲取用戶請求數據,把數據送入模型中進行處理,處理用戶交互任務。 當客戶端(瀏覽器)單擊頁面表單請求命令,控制器獲取表單請求,調用Model 來處理數據, 調用View 來包裝數據,需要調用哪些模塊由控制器來決定,最后通過瀏覽器向客戶返回請求結果。 MVC 的工作詳細流程如圖1 所示。 三大模塊的協作工作原理如一個公司的運作,Controller 如管理層只負責整個公司的調度工作,Model 如財務部只負責管理錢款流動,View 如市場部負責外部運作、包裝。

圖1 MVC 的工作流程
在軟件系統設計中MVC 框架就是一個代碼規劃的骨架,設計一個所有項目通用的底層代碼,為了提高項目開發的效率。 以房地產開發商開發的商品房來類比,MVC 框架就如開發商把房子的結構功能已完成,只是個毛坯房,業主可以根據需要去裝修,需要一個奶茶店時,只需要把房子按奶茶店的布置去裝修,而不需要重新蓋一個房子。
MVC 設計模式可以把整個項目分成應用(Application) 和 框 架(Framework) 兩 大 部 分, 在Application 應用中處理與當前站點相關的業務邏輯,在Framework 框架中封裝所有項目的底層代碼[1]。在一個MVC 框架中,往往可能有多個相對獨立的應用站點,最典型的就是一個網站的前臺界面(對外的)和后臺管理界面(對內的)。 一個平臺就是一個相對獨立的應用(站點,項目)。
本文的新聞管理系統是基于PHP 技術,采用MVC 思想進行設計。系統的目錄結構按 App, Frame,Public,index. php 進行分配。 App 中Home 目錄代表網站的前臺為用戶提供服務,Admin 目錄代表網站的后臺為管理員提供管理功能。 前臺Home 目錄和后臺Admin 目錄:Controller 主要存放模塊的控制器文件,Model 主要存放模塊的模型類文件,View 主要存放模塊的視圖文件。 App 中Conf 目錄中放置配置文件信息。 Frame為框架類庫目錄,存放框架初始化類、基礎控制器類、基礎模型類、數據庫工具類、工廠模型類底層代碼文件。 Public 為公開文件目錄,主要存放css,images 和js文件。 index.php 為系統的入口文件。
為了更好演示MVC 設計模式中各模塊的工作原理,本文設計的新聞管理系統整體功能較為簡單,但完整展示了數據的基本操作功能。 前臺模塊的主要功能是新聞瀏覽和新聞檢索功能;后臺模塊是新聞管理模塊,可以對新聞后臺的數據進行添加、刪除、修改的功能操作。 新聞管理系統總體設計結構如圖2所示。

圖2 系統總體設計結構
數據庫的設計在整個系統開發中起到至關重要的作用。 對本系統功能的需求分析后,數據庫內容設計主要包括兩個部分:一是創建管理員表用于判斷管理員身份;二是創建新聞表用于存儲新聞的詳細信息。
在MySQL 中創建一個news 數據庫,用于保存系統中的數據。 成功創建數據庫后,“use news”選擇news 數據庫,在數據庫中創建admin 管理員表和news新聞表。 在管理員表admin 中設置id 編號、name 用戶名和password 密碼字段。 在新聞表news 中設置id新聞編號、title 新聞標題、content 新聞內容、addtime發布時間字段如圖3 所示。 兩張表都成功創建完成后,需要分別為它們添加測試數據進行測試。

圖3 新聞表結構
本系統基礎框架按照前面對MVC 框架分析進行搭建。 如果客戶每次請求,都去包含所有類文件,會造成服務器內存浪費,程序的加載速度緩慢。 可以使用類的自動加載,來實現類文件的按需加載。 常量在任何地方都可以使用,而變量只能在作用域下使用。本文把MVC 中常用的目錄定義成常量,可以簡化目錄路徑的編寫。 系統的初始化階段需要完成:配置信息、路由參數、目錄常量、類的自動加載、請求分支操作。 初始化的工作可以封裝成一個Frame. class. php框架基礎類來完成任務。 將框架基礎類定義為最終的框架初始化類final class Frame{},在類中定義公共的靜態的框架初始化方法public static function run();定義self::initConfig()初始化配置信息;self::initRoute()初始化路由參數;self::initConst()初始化目錄常量;self::initAutoload()初始化類的自動加載;self::initDispatch()初始化請求分支。 調用run()方法就可以直接執行調用5 個初始化功能操作。
框架基礎類中初始化配置信息需要數據庫配置信息和路由默認參數信息,在Conf 中創建Conf.php,在文件中配置數據庫連接信息、默認路由參數。 在Frame 目錄中封裝一個數據庫操作類Db. class. php,實現從配置文件中得到配置信息,成功連接數據庫。
在MVC 設計模式中,每一個模塊都是一個控制器,多個控制器之間有一些公共的屬性和方法。 在Frame 目錄中,創建基礎控制器類BaseController.class.php 文件,將公共的基礎代碼提煉出來放在基礎控制器類中。 在創建基礎控制器類之后,Home 和Admin 模塊的控制器類都需要繼承基礎控制器類。
每個數據表都對應一個模型,多個模型之間有一些公共代碼。 在Frame 目錄中,創建基礎模型類BaseModel.class.php 文件,將公共的基礎代碼提煉出來放在基礎模型類中。 數據表admin 和news 的模型類都需要繼承基礎模型類。
在 Frame 目錄中創建一個工廠模型類FactoryModel.class.php 文件,該類可以專門生產模型類的對象。
在完成MVC 模式的基礎框架搭建后,接下來利用該框架完成后臺模塊的開發。 后臺模塊實質上就是對新聞數據的增刪改查操作。 在Admin 目錄中分別建立View,Controller,Model 3 個文件夾進行編寫功能代碼文件。 引入“平臺”概念后,客戶的每次請求,必須帶3 個參數,平臺參數,控制器參數、用戶動作。Platform 稱為P 參數,controller 稱為c 參數,action 簡稱a 參數。 因篇幅所限,下面以新聞信息的修改為例演示MVC 分工運行過程。
在后臺模塊的首頁視圖中,選擇需要修改新聞的鏈接“修改” 進行跳轉,帶著新聞唯一的編號調轉到Admin 平臺的News 控制器的edit 動作方法。 在News 控制器中edit動作方法中,獲取地址欄id 編號 $id= $_GET['id'];創建新聞模型類對象$modelObj = FactoryModel::getInstance("NewsModel");獲取指定id 數據$arr=$modelObj->fetchOne( $id)。 關于需要修改的這條新聞數據需要從Model 中調用,去新聞模型類NewsModel 獲取單行數據public function fetchOne( $id),構建查詢的SQL 語句$sql = "select ? from news where id={ $id}"; 執行SQL 語句,返回一維數組 。 修改的新聞的詳細信息就返回到News 控制器中,包含修改的視圖文件include VIEW_PATH."edit.html"進行顯示并修改。 修改后的信息需要再次重新寫入數據庫中進行存儲。