程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Zend_Controller的工作原理

Zend_Controller的工作原理

編輯:關於PHP編程

Zend_Controller是使用MVC模式來構建一個站點的基礎。Zend_Controller體系是一個輕量的,模塊化和可擴展的體系。它只提供最核心的必要的部分,允許開發者有很大的自由來靈活地構建自己的站點。使用Zend_Controller的站點,其代碼結構會有一部份是相似的。

Zend_Controller 的工作流(workflow)是通過幾個組件來實現的。雖然不需要完全理解這幾個組件的含義,如果你對工作流程有點了解是很有幫助的:

  • Zend_Controller_Front 前端控制器
  • Zend_Controller_Front(前端控制器)是Zend_Controller_Controller體系的組織者,它是FrontController設計模式的實現。 Zend_Controller_Front處理服務器接受的所有請求,並最後負責將請求分配給ActionController (Zend_Controller_Action)。Zend_Controller_Controller就是將客戶的原始請求轉發給相應的處理組件(Action)去完成具體的業務處理。

  • Zend_Controller_Router
  • Zend_Controller_Router相當於一個路由器。路由是將一個URI分解並決定由哪一個Controller,和用什麼Action來處理的過程。controller,action和可選的參數的定義,被封裝成一個對象-- Zend_Controller_Dispather_Token,然後由Zend_Controller_Dispatcher來處理。路由只發生一 次:當請求被服務器接收到時,在分配到第一個控制器之前。Zend_Controller_Router負責解析客戶的請求URI,分析其中的參數,以決定定位到哪個ActionController。Zend_Controller_Router會把分析出的參數封裝成Zend_Controller_Dispather_Token對象。

    所謂router,和我們熟知的網絡路由器的功能是很相似的,具有判斷網絡地址和選擇路徑的功能,這裡就是用來重定向。

  • Zend_Controller_Dispatcher 分配器
  • "分配"的過程即根據Zend_Controller_Dispatcher_Token來查找適合的contoller文件,實例化其中的controller類(必須實現Zend_Controller_Action),並且最後在控制器內運行action。和路由不同,分配的過程不斷重復的,Zend_Controller_Dispatcher被Zend_Controller_Front不斷調用直到所有action都依次分配完畢。Zend_Controller_Dispatcher是根據Zend_Controller_Router對請求URI的解析結果(一個Zend_Controller_Dispather_Token對象)將請求轉發給相應的Zend_Controller_Action。

  • Zend_Controller_Action
  • Zend_Controller_Action是最基本的控制器。每個具體的控制器都是從Zend_Controller_Action類繼承而來,是Zend_Controller_Action的子類,並且有自己的action方法。Zend_Controller_Action是基本的控制器,真正對一次用戶請求進行具體處理的工作是由它來完成的。

Zend_Controller的工作流程相當簡單。Zend_Controller_Front接收一個請求,然後由 Zend_Controller_Router來決定分配給哪個controller(實現Zend_Controller_Action的類)。Zend_Controller_Router把URI分解封裝成 一個Zend_Controller_Dispatcher_Token 對象。Zend_Controller_Front接著進入一個分配循環,調用Zend_Controller_Dispatcher,把token對象 傳給dispatcher來分配到具體的controller和action進行處理。在controller結束後,又把控制權交加給 Zend_Controller_Front。如果controller發現需要分配另一個controller(返回一個新的token對象),循環會一直繼續直到另一次分配執行完畢。

Zend_Controller工作流示意圖如下:

Route Process 路由過程

在你構建第一個控制器之前,你需要理解Zend_Controller_Router中的重定向過程是如何工作的。記住工作流程分為兩步:一是重定向(routing),只發生一次;二是分配(dispatching),循環過程。

Zend_Controller_Front 調用Zend_Controller_Router來使一個URI 映射到一個controller(Zend_Controller_Action類)及其中的action上。 Zend_Controller_Router分解URI,生成一個對象Zend_Controller_Dispatcher_Token,然後再傳遞給分配器(Zend_Controller_Dispatcher)。

router使用很簡單的方法來決定所要使用的controller及其action(URI映射到Zend_Controller_Action):

http://www.bkjia.com/controller/action/

上面controller就是我們要采用的控制器,action就是我們要采用的action。

其它可選擇的GET參數可以在URI中定義,並傳遞給controller。格式為key/value:http://framework.zend.com/controller/action/key1/value1/

如果/controller/這部分沒有寫明,默認調用index。 如果/action/這部份沒有寫,也默認調用index。如:

http://framework.zend.com/roadmap/future/
Controller: roadmap
Action    : future
http://framework.zend.com/roadmap/
Controller: roadmap
Action    : index
http://framework.zend.com/
Controller: index
Action    : index 

controller,action的名稱及其它參數將會被封裝到一個token對象中-- Zend_Controller_Dispatcher_Token。這個對象被傳回到Zend_Controller_Front,然後進入分配過程, 被傳遞給Zend_Controller_Dispatcher。

Token對象

Token對象是個很簡單的對象,在Zend_Controller_Front和實現router,dispatcher接口的類間傳遞。它把controller,action和其它GET參數封裝在一起。

  • controller的名稱通過getControllerName()及setControllerName()來獲得和設置
  • action的名稱過getActionName()和setActionName()來獲得和設置。
  • 傳遞給action的參數是個數組(key/value形式),可以通過getParams()來獲得,通過setParams()來設置。

Dispatch Process 分配過程

所謂分配過程,就是根據token對象(Zend_Controller_Dispatcher_Token) ,抽取其中的信息:controller的名稱,action的名稱,參數等等,然後實例化一個controller,並調用其中的action來進行處理。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved