《PHP設(shè)計(jì)模式介紹》第十七章 MVC 模式(3)_PHP教程
推薦:《PHP設(shè)計(jì)模式介紹》第十五章 表數(shù)據(jù)網(wǎng)關(guān)模式前一章中使用動(dòng)態(tài)記錄模式對(duì)數(shù)據(jù)庫(kù)表進(jìn)行建立,獲取,更新(通過(guò)擴(kuò)展實(shí)現(xiàn)刪除)每一行的操作。動(dòng)態(tài)記錄模式是一種簡(jiǎn)單的抽象數(shù)據(jù)庫(kù)連接的方式,但是這種簡(jiǎn)潔性也正是它的弱點(diǎn)。動(dòng)態(tài)記錄類只處理
Transform View
變換視圖從你的model中提取數(shù)據(jù),然后把數(shù)據(jù)轉(zhuǎn)換成需要輸出的格式。它實(shí)際上是使用一種語(yǔ)言逐個(gè)遍歷你的數(shù)據(jù)元素,然后集中輸出。
模版視圖與變換視圖之間的差異就是數(shù)據(jù)流的方向。在Template View中你先擁有一個(gè)輸出的框架然后向里面插入domain數(shù)據(jù)。Transform View中則從數(shù)據(jù)著手,從它之中建立輸出。
實(shí)施Transform View的主要技術(shù)是xslt.
Controller
controller是MVC里的一個(gè)角色,很多php MVC框架都講到了。主要是出于這樣的考慮:model對(duì)于應(yīng)用是特定的,而幾乎每個(gè)開發(fā)人員都已經(jīng)有他們喜愛(ài)的模版引擎,它是視圖的一個(gè)主要要素。那使得解釋http回應(yīng),控制申請(qǐng)流(采取適當(dāng)?shù)男袆?dòng)來(lái)顯示),兩個(gè)關(guān)聯(lián)的任務(wù)合為一個(gè)通用框架。
Front Controllers
它常常有助于集中控制應(yīng)用流于一點(diǎn)。集中化可以幫助你了解一個(gè)復(fù)雜的系統(tǒng)是怎樣運(yùn)行的,以及提供你一個(gè)可以插入全局代碼的空間,比如一個(gè)Intercepting Filter模式。對(duì)于集中化,F(xiàn)ront Controllers對(duì)于集中控制的系統(tǒng)是很好的選擇。
注:intercepting Filter
intercepting Filter模式是gof書中的Chain of Responsibility模式的一個(gè)實(shí)例。它考慮了運(yùn)用普通任務(wù)的連續(xù)處理請(qǐng)求,譬如記log和安全。
這有兩個(gè)普通的實(shí)例。一是在某個(gè)鏈中連續(xù)使用補(bǔ)空格直到到達(dá)application controller,另一個(gè)類似于一系列的油漆工,有助于前后的補(bǔ)空動(dòng)作。(考慮移除空白或者一個(gè)壓縮的filter,你可以在預(yù)處理輸出緩存,在加工后執(zhí)行你的filter)
作為一個(gè)簡(jiǎn)單的實(shí)例,一個(gè)Intercepting Filter和一個(gè)Front controller聯(lián)合起來(lái)會(huì)是怎么樣,假設(shè)我們有perfilter()以及postfilter()兩種方法用于我們的filter接口。然后我們可以使用一種方法把filter加到我們的Front controller.
| class FrontController { var $_filter_chain = array(); function registerFilter(&$filter) { $this->_filter_chain[] =& $filter; } } |
在運(yùn)行實(shí)際的Front controller工作之前(產(chǎn)生頁(yè)面,分派等等),我們可以在序列中使用prefilter()方法,在Front controller完成了它的任務(wù)后,postfilter方法可以在相反的順序調(diào)用。
|
class FrontController { Application controller |
Front controller通常代替了Application controller,而Application controller模式才是MVC controller的核心所在。controller的首要責(zé)任就是決定應(yīng)用程序要做些什么來(lái)響應(yīng)請(qǐng)求。
實(shí)現(xiàn)controller的最典型的方法就是使用命令模式。命令模式包含了對(duì)象中的一個(gè)動(dòng)作,這樣你就能用參數(shù)表示一個(gè)請(qǐng)求,寫入請(qǐng)求隊(duì)列,記入日志,或者支持操作(例如一個(gè)撤銷動(dòng)作)。在web應(yīng)用的上下文關(guān)聯(lián)中,分派給命令模式并完成一個(gè)特殊的http請(qǐng)求作為代碼的目標(biāo)是有用的。本質(zhì)上,命令模式讓你中止你的應(yīng)用和代碼的不連續(xù)行為,每個(gè)作為一個(gè)小的,便于管理的類,用一個(gè)相同的api使controller分派到一個(gè)明確的具體命令來(lái)實(shí)現(xiàn)需要的應(yīng)用功能。
不要讓強(qiáng)加的過(guò)多關(guān)于controller以及分派的敘述混淆你。如果你已經(jīng)花了甚至幾個(gè)小時(shí)在php上,那你可能已經(jīng)寫了一些Application controller. 比如,一個(gè)簡(jiǎn)單的傳遞回給它自己的表單,比如.....
| if (count($_POST)) { // do form handling code } else { // display the form } |
....是一種Application controller形式。稍微有點(diǎn)復(fù)雜的Application controller像以下的:
| switch ($_POST[‘action’]) { case ‘del’: $action_class = ‘DeleteBookmark’; break; case ‘upd’: $action_class = ‘UpdateBookmark’; break; case ‘add’: $action_class = ‘InsertBookmark’; break; case ‘show’: default: $action_class = ‘DisplayBookmark’; } if (!class_defined($action)) { require_once ‘actions/’.$action_class.’.php’; } $action =& new $action_class; $action->run(); |
另一種可能實(shí)現(xiàn)分派的方法就是:用一個(gè)配置裝載一個(gè)聯(lián)合的數(shù)組。你可以如下方式作為結(jié)尾:
| $action_map = array( ‘del’ => ‘DeleteBookmark’ ,’upd’ => ‘UpdateBookmark’ ,’add’ => ‘InsertBookmark’ ); $action_class = (array_key_exists($_POST[‘action’], $action_map)) ? $action_map[$_POST[‘action’]] : ‘DisplayBookmark’; if (!class_defined($action)) { require_once ‘actions/’.$action_class.’.php’; } $action =& new $action_class; $action->run(); |
根據(jù)我在web應(yīng)用方面的經(jīng)驗(yàn)顯示,一個(gè)雙分派結(jié)構(gòu)可以成為一個(gè)有用的mental map用來(lái)比較框架間依賴的分派裝置。第一個(gè)調(diào)度是一個(gè)需要用你的model來(lái)進(jìn)行的動(dòng)作。在一個(gè)可見(jiàn)的動(dòng)作之后,發(fā)出一個(gè)http跳轉(zhuǎn)指令指示客戶端去取得一個(gè)特定的View。第二個(gè)調(diào)度就是選擇一個(gè)特定的View。(在這種方法的早期程序中,我使用了一個(gè)條件語(yǔ)句,但MVC實(shí)例本身對(duì)使用Command pattern進(jìn)行調(diào)度)
分享:《PHP設(shè)計(jì)模式介紹》第十四章 動(dòng)態(tài)記錄模式到目前為止,您所看到的這些設(shè)計(jì)模式大大提高了代碼的可讀性與可維護(hù)性。然而,在WEB應(yīng)用設(shè)計(jì)與開發(fā)中一個(gè)基本的需求與挑戰(zhàn):數(shù)據(jù)庫(kù)應(yīng)用,這些設(shè)計(jì)模式都沒(méi)有涉及到。本章與接下來(lái)的兩章—
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁(yè)面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問(wèn)控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語(yǔ)言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國(guó)語(yǔ)言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
- 教程說(shuō)明:
PHP教程-《PHP設(shè)計(jì)模式介紹》第十七章 MVC 模式(3)
。