蔣先梅
(江蘇聯(lián)合職業(yè)技術(shù)學(xué)院徐州經(jīng)貿(mào)分院,江蘇 徐州 221004)
PHP 即“超文本預(yù)處理器”,是一種開源的、免費(fèi)使用的、運(yùn)行在服務(wù)器端的腳本語言[1]。 PHP 吸納多個(gè)語言的優(yōu)點(diǎn),創(chuàng)造出自己獨(dú)特方便快速的語法風(fēng)格。 PHP 支持面向過程和面向?qū)ο筮@兩種開發(fā)方式。PHP 和HTML 可以相互嵌入使用,修改快捷、簡(jiǎn)易、實(shí)用性強(qiáng)、跨平臺(tái)性好、方便移植,在Web 系統(tǒng)開發(fā)領(lǐng)域中占據(jù)了重要的地位[1]。 MVC 是一種軟件開發(fā)模式,已廣泛流行于系統(tǒng)的開發(fā)與應(yīng)用中。 隨著互聯(lián)網(wǎng)高速發(fā)展,Web 應(yīng)用的功能需要也越來越復(fù)雜,MVC 在Web 開發(fā)領(lǐng)域也備受歡迎。
MVC 全稱ModelViewController,是一種軟件設(shè)計(jì)思想典范。 Model(數(shù)據(jù)模型)、View(視圖)、Controller(控制器)三大核心模塊在Web 系統(tǒng)起到至關(guān)重要的作用,分別處理各自范圍內(nèi)的事情[1]。 數(shù)據(jù)模型只與數(shù)據(jù)庫有關(guān)系,只處理應(yīng)用程序數(shù)據(jù)邏輯部分,數(shù)據(jù)庫的數(shù)據(jù)增刪改查在此模塊內(nèi)實(shí)現(xiàn)。 視圖把從數(shù)據(jù)模型中獲取的數(shù)據(jù),進(jìn)行格式化展示到瀏覽器的前端頁面上。 控制器是整個(gè)系統(tǒng)的調(diào)度中心,統(tǒng)一協(xié)調(diào)各模塊之間的工作。 控制器經(jīng)常從視圖中獲取用戶請(qǐng)求數(shù)據(jù),把數(shù)據(jù)送入模型中進(jìn)行處理,處理用戶交互任務(wù)。 當(dāng)客戶端(瀏覽器)單擊頁面表單請(qǐng)求命令,控制器獲取表單請(qǐng)求,調(diào)用Model 來處理數(shù)據(jù), 調(diào)用View 來包裝數(shù)據(jù),需要調(diào)用哪些模塊由控制器來決定,最后通過瀏覽器向客戶返回請(qǐng)求結(jié)果。 MVC 的工作詳細(xì)流程如圖1 所示。 三大模塊的協(xié)作工作原理如一個(gè)公司的運(yùn)作,Controller 如管理層只負(fù)責(zé)整個(gè)公司的調(diào)度工作,Model 如財(cái)務(wù)部只負(fù)責(zé)管理錢款流動(dòng),View 如市場(chǎng)部負(fù)責(zé)外部運(yùn)作、包裝。
圖1 MVC 的工作流程
在軟件系統(tǒng)設(shè)計(jì)中MVC 框架就是一個(gè)代碼規(guī)劃的骨架,設(shè)計(jì)一個(gè)所有項(xiàng)目通用的底層代碼,為了提高項(xiàng)目開發(fā)的效率。 以房地產(chǎn)開發(fā)商開發(fā)的商品房來類比,MVC 框架就如開發(fā)商把房子的結(jié)構(gòu)功能已完成,只是個(gè)毛坯房,業(yè)主可以根據(jù)需要去裝修,需要一個(gè)奶茶店時(shí),只需要把房子按奶茶店的布置去裝修,而不需要重新蓋一個(gè)房子。
MVC 設(shè)計(jì)模式可以把整個(gè)項(xiàng)目分成應(yīng)用(Application) 和 框 架(Framework) 兩 大 部 分, 在Application 應(yīng)用中處理與當(dāng)前站點(diǎn)相關(guān)的業(yè)務(wù)邏輯,在Framework 框架中封裝所有項(xiàng)目的底層代碼[1]。在一個(gè)MVC 框架中,往往可能有多個(gè)相對(duì)獨(dú)立的應(yīng)用站點(diǎn),最典型的就是一個(gè)網(wǎng)站的前臺(tái)界面(對(duì)外的)和后臺(tái)管理界面(對(duì)內(nèi)的)。 一個(gè)平臺(tái)就是一個(gè)相對(duì)獨(dú)立的應(yīng)用(站點(diǎn),項(xiàng)目)。
本文的新聞管理系統(tǒng)是基于PHP 技術(shù),采用MVC 思想進(jìn)行設(shè)計(jì)。系統(tǒng)的目錄結(jié)構(gòu)按 App, Frame,Public,index. php 進(jìn)行分配。 App 中Home 目錄代表網(wǎng)站的前臺(tái)為用戶提供服務(wù),Admin 目錄代表網(wǎng)站的后臺(tái)為管理員提供管理功能。 前臺(tái)Home 目錄和后臺(tái)Admin 目錄:Controller 主要存放模塊的控制器文件,Model 主要存放模塊的模型類文件,View 主要存放模塊的視圖文件。 App 中Conf 目錄中放置配置文件信息。 Frame為框架類庫目錄,存放框架初始化類、基礎(chǔ)控制器類、基礎(chǔ)模型類、數(shù)據(jù)庫工具類、工廠模型類底層代碼文件。 Public 為公開文件目錄,主要存放css,images 和js文件。 index.php 為系統(tǒng)的入口文件。
為了更好演示MVC 設(shè)計(jì)模式中各模塊的工作原理,本文設(shè)計(jì)的新聞管理系統(tǒng)整體功能較為簡(jiǎn)單,但完整展示了數(shù)據(jù)的基本操作功能。 前臺(tái)模塊的主要功能是新聞瀏覽和新聞檢索功能;后臺(tái)模塊是新聞管理模塊,可以對(duì)新聞后臺(tái)的數(shù)據(jù)進(jìn)行添加、刪除、修改的功能操作。 新聞管理系統(tǒng)總體設(shè)計(jì)結(jié)構(gòu)如圖2所示。
圖2 系統(tǒng)總體設(shè)計(jì)結(jié)構(gòu)
數(shù)據(jù)庫的設(shè)計(jì)在整個(gè)系統(tǒng)開發(fā)中起到至關(guān)重要的作用。 對(duì)本系統(tǒng)功能的需求分析后,數(shù)據(jù)庫內(nèi)容設(shè)計(jì)主要包括兩個(gè)部分:一是創(chuàng)建管理員表用于判斷管理員身份;二是創(chuàng)建新聞表用于存儲(chǔ)新聞的詳細(xì)信息。
在MySQL 中創(chuàng)建一個(gè)news 數(shù)據(jù)庫,用于保存系統(tǒng)中的數(shù)據(jù)。 成功創(chuàng)建數(shù)據(jù)庫后,“use news”選擇news 數(shù)據(jù)庫,在數(shù)據(jù)庫中創(chuàng)建admin 管理員表和news新聞表。 在管理員表admin 中設(shè)置id 編號(hào)、name 用戶名和password 密碼字段。 在新聞表news 中設(shè)置id新聞編號(hào)、title 新聞標(biāo)題、content 新聞內(nèi)容、addtime發(fā)布時(shí)間字段如圖3 所示。 兩張表都成功創(chuàng)建完成后,需要分別為它們添加測(cè)試數(shù)據(jù)進(jìn)行測(cè)試。
圖3 新聞表結(jié)構(gòu)
本系統(tǒng)基礎(chǔ)框架按照前面對(duì)MVC 框架分析進(jìn)行搭建。 如果客戶每次請(qǐng)求,都去包含所有類文件,會(huì)造成服務(wù)器內(nèi)存浪費(fèi),程序的加載速度緩慢。 可以使用類的自動(dòng)加載,來實(shí)現(xiàn)類文件的按需加載。 常量在任何地方都可以使用,而變量只能在作用域下使用。本文把MVC 中常用的目錄定義成常量,可以簡(jiǎn)化目錄路徑的編寫。 系統(tǒng)的初始化階段需要完成:配置信息、路由參數(shù)、目錄常量、類的自動(dòng)加載、請(qǐng)求分支操作。 初始化的工作可以封裝成一個(gè)Frame. class. php框架基礎(chǔ)類來完成任務(wù)。 將框架基礎(chǔ)類定義為最終的框架初始化類final class Frame{},在類中定義公共的靜態(tài)的框架初始化方法public static function run();定義self::initConfig()初始化配置信息;self::initRoute()初始化路由參數(shù);self::initConst()初始化目錄常量;self::initAutoload()初始化類的自動(dòng)加載;self::initDispatch()初始化請(qǐng)求分支。 調(diào)用run()方法就可以直接執(zhí)行調(diào)用5 個(gè)初始化功能操作。
框架基礎(chǔ)類中初始化配置信息需要數(shù)據(jù)庫配置信息和路由默認(rèn)參數(shù)信息,在Conf 中創(chuàng)建Conf.php,在文件中配置數(shù)據(jù)庫連接信息、默認(rèn)路由參數(shù)。 在Frame 目錄中封裝一個(gè)數(shù)據(jù)庫操作類Db. class. php,實(shí)現(xiàn)從配置文件中得到配置信息,成功連接數(shù)據(jù)庫。
在MVC 設(shè)計(jì)模式中,每一個(gè)模塊都是一個(gè)控制器,多個(gè)控制器之間有一些公共的屬性和方法。 在Frame 目錄中,創(chuàng)建基礎(chǔ)控制器類BaseController.class.php 文件,將公共的基礎(chǔ)代碼提煉出來放在基礎(chǔ)控制器類中。 在創(chuàng)建基礎(chǔ)控制器類之后,Home 和Admin 模塊的控制器類都需要繼承基礎(chǔ)控制器類。
每個(gè)數(shù)據(jù)表都對(duì)應(yīng)一個(gè)模型,多個(gè)模型之間有一些公共代碼。 在Frame 目錄中,創(chuàng)建基礎(chǔ)模型類BaseModel.class.php 文件,將公共的基礎(chǔ)代碼提煉出來放在基礎(chǔ)模型類中。 數(shù)據(jù)表admin 和news 的模型類都需要繼承基礎(chǔ)模型類。
在 Frame 目錄中創(chuàng)建一個(gè)工廠模型類FactoryModel.class.php 文件,該類可以專門生產(chǎn)模型類的對(duì)象。
在完成MVC 模式的基礎(chǔ)框架搭建后,接下來利用該框架完成后臺(tái)模塊的開發(fā)。 后臺(tái)模塊實(shí)質(zhì)上就是對(duì)新聞數(shù)據(jù)的增刪改查操作。 在Admin 目錄中分別建立View,Controller,Model 3 個(gè)文件夾進(jìn)行編寫功能代碼文件。 引入“平臺(tái)”概念后,客戶的每次請(qǐng)求,必須帶3 個(gè)參數(shù),平臺(tái)參數(shù),控制器參數(shù)、用戶動(dòng)作。Platform 稱為P 參數(shù),controller 稱為c 參數(shù),action 簡(jiǎn)稱a 參數(shù)。 因篇幅所限,下面以新聞信息的修改為例演示MVC 分工運(yùn)行過程。
在后臺(tái)模塊的首頁視圖中,選擇需要修改新聞的鏈接“修改” 進(jìn)行跳轉(zhuǎn),帶著新聞唯一的編號(hào)調(diào)轉(zhuǎn)到Admin 平臺(tái)的News 控制器的edit 動(dòng)作方法。 在News 控制器中edit動(dòng)作方法中,獲取地址欄id 編號(hào) $id= $_GET['id'];創(chuàng)建新聞模型類對(duì)象$modelObj = FactoryModel::getInstance("NewsModel");獲取指定id 數(shù)據(jù)$arr=$modelObj->fetchOne( $id)。 關(guān)于需要修改的這條新聞數(shù)據(jù)需要從Model 中調(diào)用,去新聞模型類NewsModel 獲取單行數(shù)據(jù)public function fetchOne( $id),構(gòu)建查詢的SQL 語句$sql = "select ? from news where id={ $id}"; 執(zhí)行SQL 語句,返回一維數(shù)組 。 修改的新聞的詳細(xì)信息就返回到News 控制器中,包含修改的視圖文件include VIEW_PATH."edit.html"進(jìn)行顯示并修改。 修改后的信息需要再次重新寫入數(shù)據(jù)庫中進(jìn)行存儲(chǔ)。
前臺(tái)界面設(shè)計(jì)風(fēng)格簡(jiǎn)潔,操作簡(jiǎn)易,用戶只能瀏覽、閱讀和檢索新聞。 用戶根據(jù)時(shí)間顯示的順序可以選擇自己感興趣的新聞標(biāo)題,點(diǎn)擊進(jìn)去查閱詳細(xì)信息;也可以利用模糊匹配查找自己感興趣的新聞信息。
本文用PHP 技術(shù)基于MVC 設(shè)計(jì)模式實(shí)現(xiàn)了一個(gè)新聞管理系統(tǒng)。 MVC 設(shè)計(jì)結(jié)構(gòu)清晰明了,實(shí)現(xiàn)了模型、視圖、控制器三者分離,便于提高代碼的可維護(hù)性和功能擴(kuò)展性。