PHP 板


LINE

看板 PHP  RSS
前陣子在一個網站上看到一篇關於在PHP程式中使用MVC設計模式的文章, 覺得挺有意思的。MVC(Model-View-Controller)模式相信不少人聽過, 但是這篇文章是我看過的裡面以非常明確的例子來說明在PHP程式裡面使用 MVC模式的一篇。是一篇很短的文章,但是卻在很短的篇幅裡面提供了 不少有用的東西。 model負責包裝應用程式邏輯,將資料在各種型態之間作轉換(將資料庫中 儲存的資料轉換為另一種格式並回傳,或者將接收到的資料轉換為適於 儲存的格式並存入)。view負責將資料呈現給客戶端。controller則是 兩者的橋樑,負責流程控制。 以一個產品型錄的網站應用程式為例子,使用MVC模式的架構簡單來看是: ProductView | | Request data | Client --------------------> ProductController <=================== | Result (HTML/XML/CSV...) | | ProductModel(getProducts(), getProductById()...) | |-----|----|----| | | | | TEXT XML DB SMTP... 現在假設來自客戶端的要求是呈現id為101的產品資料: 1. controller是直接面對客戶端的唯一接觸點,來自客戶端的資料都是由controller 接收,最後要呈現給客戶端的資料也是由controller回傳給客戶端。此時controller 從客戶端接收到兩項資訊:1.我要看的畫面是商品詳細資料 2.商品的識別碼是101。 2. controller首先驗證接收到的資料是否有效,它必須確認1.我們確實有提供商品 詳細資料畫面這項功能,以及2.商品的識別碼是有效的。但是controller本身並不負責 實作驗證資料的相關邏輯,資料如何被驗證應該實作在model裡面,controller只是 呼叫model提供的資料驗證方式,傳入資料並且依照model回傳的結果決定下一步驟。 因此此時controller所執行的步驟類似: if(ProductModel::is_valid_id($_GET['prod_id'])) { // 商品識別碼有效 } else { // 商品識別碼無效 } 3. 資料驗證後有效後,controller呼叫由model所提供的功能,傳入需要的參數 並且取回由model轉換整理過後的資料: $prod_data = ProductModel::getProductById($_GET['prod_id']); 商品資料以何種型式儲存在何種媒介之中,只有model知道。也許商品資料被存放在 資料庫中,分散在三個資料表裡面。model會負責取出必須的資料,整理成有意義的 格式並且回傳。這裡所謂有意義的格式也許是一個物件,或者一個hashtable,重點 在於這個格式和最後資料會如何被呈現完全無關。model並不知道這項資料是要被 顯示在一般瀏覽器上(HTML)或者顯示在手機上面(WML),或者其他型式。 4. 從model取回的資料,必須轉換成客戶端可了解的型式,這部分是view的責任。 因此controller將取回的商品資料,連同其他必要指示,傳送給view。 $instructions = array( 'page' => 'product_detail', 'client_type' => 'standard_browser' ); $output = ProductView::get_output($instructions, $prod_data); view根據接收到的指示與資料,將$prod_data(也許是一個hashtable)轉換成 顯示商品詳細資料的HTML原始碼(因為client_type='standard_browser',也許 如果client_type=smart_phone,view就會傳回WML格式的資料,whatever)。 5. 現在controller得到了可以回傳給客戶端的HTML。這時候它可以直接回傳給 客戶端: echo $output; 或者也許controller從瀏覽器類型得知這是個簡體版的瀏覽器,因此把$output 轉換成簡體字之後再傳送給客戶端: $output = CharConverter::trad_to_simp($output); echo $output; 以上的架構中,model, view, controller三種角色區分得很清楚。依照個人的經驗, 在實際寫的時候,從程式碼之中可以觀察到以下的特性: 1. controller裡面不會有任何HTML,因為它不負責資料如何呈現。 2. controller裡面不會有任何SQL或者fopen()因為它不負責資料如何儲存與取得。 3. model裡面不會有任何HTML(同上)。 4. model是唯一會存取資料庫,資料檔,SMTP server或者其他資料媒介的地方。 5. model裡面不會出現echo(), print(), header(), exit, 這些只出現在controller。 6. view裡面不會出現SQL/fopen(), echo(), print(), header(), exit... 7. view是唯一會出現HTML/XML/CSV...的地方。不過若搭配樣板引擎,view裡面也 不會有這些,樣板檔案裡面才有。 8. model以及view裡面都不會直接存取$_GET, $_POST, $_COOKIE這些資料。 9. model裡面才會出現資料結構與演算法(不論複雜程度如何),controller/view 裡面只會有很簡單的if/else/switch,controller裡面甚至不會出現迴圈。 10. model與view對彼此一無所知,controller是兩者的中介。 以上是個人對於在PHP程式裡面使用MVC模式的一些心得,歡迎一起討論:) --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.115.146.31
1F:推 ckmarkhsu:vBulletin3.5的系統好像有用這個架構實作喔:) 02/27 07:18
2F:推 ottokang:和我在書裡看到得很類似~好文! 02/27 14:05
3F:推 wawawa:好文一定要推的 02/27 16:31
4F:推 ast9869:哇勒~原來我做的網站架構就是MVC啊 orz 02/27 20:07
5F:推 kakashiliu:不知道有沒有人能分享更多實做的方法? 02/28 02:23
6F:推 ails:http://www.cakephp.org 還不賴 02/28 05:51
7F:推 fillano:其實xoops2也是可以用MVC實做的,extends他的XoopsObject 02/28 13:57
8F:→ fillano:還有XoopsObjectHandler把資料包裝成Model不知道算不算 02/28 13:59
9F:推 oiolong:好文必推! 03/09 18:10







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP