作者 主題: Zend Framework Part 5 Zend_Contoller的基本概念  (閱讀 2971 次)

0 會員 與 1 訪客 正在閱讀本文。

uberr

  • 懷疑的國中生
  • **
  • 文章數: 62
    • 檢視個人資料
    • 天創科技網頁設計公司
Zend_Controller是整個Zend Framework的核心.主要的功能是接收你的請求(request)然後分發(dispatch)你的請求,最後接收回應(response).



從上圖中,我們可以看到Zend_Controller如何運作.

1.首先會建立一個Zend_Controller_Front,它是Singleton(getInstance).只可以創建一個,同時建立request和response Object.
註:request Object是用來儲存請求的資料.response Object是用來儲存 response 的header和body.

2.接收請求(要去哪一個controller,action,帶有什麼parameter),由Zend_Controller_Request把所需要的資料寫到$request Object.

3. 然後由Zend_Controller_Router把請求路由到所指定的controller,action,交由Zend_Controller_Dispatch_Standard,路由只會做一次.

4. 當Dispatch接收到請求後,就會把Controller同action format成它所需要的標準.
註:所接收的Controller和Action名稱都會以小寫為名.例如請求到foo Controller的bar Action.它叫會從request Object讀取array(‘controller’=> ‘foo’,’action’=> ‘bar’),然後它會把foo format成ufirst(foo).’Controller’,bar format成 bar.’Action’.
如果你要想要有大小寫之分,例如: 請求到salesInvoice Controller的addInvoice Action.哪就要把它寫成 /sales.invoice/add.invoice or /sales-invoice/add-invoice.


5.   Dispatch係會以一個loop的方式去做,它會有一個flag,當接收第一個請求的時候,它初始為true,如果你在任何動作其間重設了這個值,哪就會重新回到Dispatch起點然後分發動作給Action.
舉一個例子好了:
當你想新增一個invoice同時想把它寫進log裡頭,首先發出一個請求請求 /invoice/add

代碼: [選擇]
Class InvoiceController extends Zend_Controller_Action {

Public function addAction() {
// 如果新增成功,寫進log File裡頭
If() {
// 呼叫Log Action,同時重設Dispatch的flag
$this->_forward(‘log’);
}
}

Public function logAction() {
//寫入到log file
}
}

6.   當執行完Action動作之後,如果没有其它動作要進行,就會回傳response,如果Controller Front没有要求處理回傳的資料的話,哪就會自動把response output出去.

由Front Controller處理response例子:

Index.php
代碼: [選擇]
$controller = Zend_Controller_Front::getInstance();
$controller->setDirectory(‘./application/controllers’);
$controller->throwExceptions(false);
$controller->returnResponse(‘true’); // 要求回傳response,由自己處理

$response = $controller->dispatch();

// 處理回傳的response
If($response->isException()) :

Endif;

$response->sendResponse(); // Output你的header和body

今天只為大家介紹Zend Controller的基本概念.還有更多的東西需要學習.例如:Zend_Controller_Route,Zend_Controller_Plugin.
« 上次編輯: 2008-03-16 23:41 由 uberr »