日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

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

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

推薦:《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 {
//...
function run() {
foreach(array_keys($this->_filter_chain) as $filter) {
$this->_filter_chain[$filter]->preFilter();
}
$this->_process();
foreach(
array_reverse(array_keys($this->_filter_chain)) as $filter) {
$this->_filter_chain[$filter]->postFilter();
}
}
function _process() {
// do the FrontController work
}
}

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)的兩章—

來(lái)源:模板無(wú)憂//所屬分類:PHP教程/更新時(shí)間:2008-08-22
相關(guān)PHP教程