《PHP設(shè)計模式介紹》第十七章 MVC 模式_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:《PHP設(shè)計模式介紹》第十五章 表數(shù)據(jù)網(wǎng)關(guān)模式
      前一章中使用動態(tài)記錄模式對數(shù)據(jù)庫表進行建立,獲取,更新(通過擴展實現(xiàn)刪除)每一行的操作。動態(tài)記錄模式是一種簡單的抽象數(shù)據(jù)庫連接的方式,但是這種簡潔性也正是它的弱點。動態(tài)記錄類只處理

      web應(yīng)用是十分多樣化的,為了實現(xiàn)某種應(yīng)用,那哪種或哪些是最好的呢?或者說,對于web應(yīng)用有沒有一種最好的體系?

      問題

      你能配置一個單一的web體系去滿足每個普通的web應(yīng)用嗎?包括一般性的界面呈現(xiàn)風格,身份驗證,表單數(shù)據(jù)確認等等?

      解決方案:

      MVC模式把你的軟件組織架構(gòu)分解成3個清晰的任務(wù)

      model結(jié)合了應(yīng)用數(shù)據(jù),應(yīng)用流程以及業(yè)務(wù)邏輯

      view從model中提取數(shù)據(jù)并呈現(xiàn)出來

      controller調(diào)用應(yīng)用流程,接收輸入并傳送給model和view

      注:MVC的起源

      MVC模式是1970年由trygve reenskaug在施樂公司的研究中心提出的。最早的參考例程代碼是用smalltalk80編寫的。它最初是用來解決應(yīng)用軟件中的用戶圖形界面的交互問題的。

      你要使用了MVC模式,你就會知道它是多么的有用,尤其是對于圖形化的用戶界面應(yīng)用。除此之外,MVC對web應(yīng)用也非常有用,雖然web服務(wù)進行通訊連接,與通訊過程有時會中斷,但這也帶來了一些獨特的挑戰(zhàn)和機會。

      假如你到這一章來尋找一種真正的對于web應(yīng)用的MVC方法,我希望你不會對于這里的答案太失望。最完美的解決方案是不存在的,但是這里有很多實例以及相關(guān)的模式,幫助你有效的去實施MVC。有希望的是,這里的觀點能作為你的編碼工作的跳板,并且?guī)ьI(lǐng)你進行更多的研究。

      模塊視圖控制器

      不像其他的設(shè)計模式,MVC模式不是一個注重于講述一種可以直接設(shè)計編碼的類結(jié)構(gòu)的模式。相反,它不僅僅是概念上的指導(dǎo)或范例。

      在概念上,MVC模式的定義的是model,view以及controller三者之間的橋梁。controller以及view都依賴于model,因為view和controller都得向model發(fā)送數(shù)據(jù)請求。數(shù)據(jù)通過controller輸入到你的系統(tǒng)當中,并最終通過view顯示出結(jié)果。對于你一個php開發(fā)者,更具體的來說,controller處理每一個外部的http請求,而view將產(chǎn)生http回應(yīng)。

      下邊是MVC模式的定義圖

      在理想的MVC環(huán)境中,通訊是直接的,如下面的序列圖。

      當然,具體到細節(jié)上就有些差異了。當在web應(yīng)用里實施MVC時,在單一的類中不會出現(xiàn)model,view以及controller,MVC把各組對象緊密地連接起來,每組對象實現(xiàn)一種特定的任務(wù)。controller可以由幾類組成,用來分析http請求,以確定應(yīng)用程序所要進行的處理動作。model一般是由很多類組成。web應(yīng)用里的view通常是一種摸版體系,可以由一些對象組成。

      在接下來的幾節(jié),讓我們深入挖掘“MVC三和音”的每個部分,了解哪些設(shè)計模式存在于或推動每個部分,以及他們?nèi)绾螏椭氵M行編碼工作。

      Model

      model包含你的應(yīng)用邏輯以及應(yīng)用數(shù)據(jù),它可能是你的應(yīng)用中最主要的邏輯處理部分。model沒有任何關(guān)于界面風格的表達,對于處理http請求也沒有起什么作用。

      Domain Model

      域model是對象的一層,它將應(yīng)用程序處理的問題、數(shù)據(jù)以及業(yè)務(wù)邏輯抽象化。域model可以歸為兩大類:簡單域model以及富域model

      簡單域model在業(yè)務(wù)對象與數(shù)據(jù)庫表單間產(chǎn)生一對一的響應(yīng)。你已經(jīng)見過一些模式--active record,table data gateway,以及datamapper,所有數(shù)據(jù)庫相關(guān)的設(shè)計模式,他們可以幫助你將數(shù)據(jù)庫相關(guān)的邏輯組織成一個域model(為了使本書中的例子合理,簡潔易懂,選取的材料都沒有超過簡單域model的一對一響應(yīng)的范圍---同形映射)

      一個富域model包括由一堆緊緊交織在一起的對象構(gòu)成的復(fù)雜的web,這些對象使用了繼承機制,本書以及gof當中的很多設(shè)計模式都覆蓋了這些內(nèi)容。富域model更容易被測試以及反復(fù)重構(gòu),外加緊密地和商業(yè)需求結(jié)合在一起。

      采用哪種域model就要看你的應(yīng)用程序的上下文了。如果你只是傳送一個相當簡單的表單處理web應(yīng)用,就沒有必要建立富域model了。但是,如果你要編寫一個庫,那是一個數(shù)百萬美元市值的公司的內(nèi)部網(wǎng)的底層結(jié)構(gòu),那就需要建立一個富域model了,它提供了一個精確的表述業(yè)務(wù)處理以及迅速的數(shù)據(jù)計算的平臺。

      martin fowler致力于開發(fā)富域model,簡要的覆蓋了poeaa中的域模型的類型以及在eric evans的書中的域驅(qū)動設(shè)計

      View

      view主要處理所有界面呈現(xiàn)的問題。view從model里提取數(shù)據(jù),把它格式化成html頁面或者xml頁面服務(wù),又或者用于email的文本。

      鑒定你是否把你的代碼分離成明確定義了的任務(wù)的一個好方法就是:嘗試代替(至少在概念上)另一個wiew,這個view產(chǎn)生完全不同的輸出。舉個例子,如果你有一個web應(yīng)用,為了迅速的使你的web程序在php的命令行模式下運行,你要改動什么呢?

      直接通過View中的表單調(diào)用Model中的方法去修改數(shù)據(jù)是不合適的,數(shù)據(jù)的更新修改方法只能借助Controller來調(diào)用。View只能以數(shù)據(jù)的只讀方式調(diào)用Model中的方法,不能對數(shù)據(jù)進行修改。一般情況下有兩種View設(shè)計模式:Template View和Transform View。

      Template View

      用于web 應(yīng)用的view中使用的主要模式就是Template View,這個模式使用一個模版文件(通常是html),它包括了一些特殊標記,當Template View被執(zhí)行時,這些特殊標記就被model里的對應(yīng)數(shù)據(jù)替換并顯示出來。

      php 本身就是一種特定類型的實例模版,叫做服務(wù)器頁。一個模版系統(tǒng)是基于使用php作為模版的,它本身是savant(http://www.phpsavant.com/)

      分享:《PHP設(shè)計模式介紹》第十四章 動態(tài)記錄模式
      到目前為止,您所看到的這些設(shè)計模式大大提高了代碼的可讀性與可維護性。然而,在WEB應(yīng)用設(shè)計與開發(fā)中一個基本的需求與挑戰(zhàn):數(shù)據(jù)庫應(yīng)用,這些設(shè)計模式都沒有涉及到。本章與接下來的兩章—

      共4頁上一頁1234下一頁
      來源:模板無憂//所屬分類:PHP教程/更新時間:2008-08-22
      相關(guān)PHP教程