在 該系列的第一部分中,簡要介紹了zend_controller的相關元件,在第二部分的我們將詳細介紹相關元件是怎樣工作的,並結合源**進行一些講 解。講解源**的版本是zend framework 1.7,但由於zend_controller已經相當的穩定,本文的講解可以適用於1.x分支,如發現有差別,可查閱官方的從以前的版本移植章節。如不 特殊說明,本文所有內容僅針對http。
zend_controller 的工作流由前端控制器zend_controller_front啟動,zend_controller_front除了 啟動工作流外,還包括處理在工作流中的相關設定,比如:路由器設定、分發器設定、外掛程式操作、請求和響應物件等。當然在一般情況下,不用自己手動設定這些東 西,系統會自動使用預設值。而且,在不明白zend_controller的工作流程情況下最好不要盲目設定。zend_controller工作流程如 下圖:
在 zend_controller_front執行了dispatch方法後,zend_controller的工作流程開始運作。在 zend_controller_front的dispatch方法中,包括經過路由器、由分發器呼叫控制器、控制器處理動作、執行外掛程式機制等。在本文後 面的部分將會分別對其進行介紹。
路由器是zend_controller工作流中第乙個遇到的元件。路由器的作用是分析當前請求的uri,根據路由規則解析出當前的uri需要呼叫的模組 名、控制器名、控制器動作名、引數。這些資訊會被傳遞給zend_controller_request(本文中是 zend_controller_request_http)物件中。在路由器元件中包括兩部分:路由器和路由規則,路由器用管理路由規則,而路由規則是 用來解析當前的uri。路由器的實現需要繼承zend_controller_router_abstract抽象類;而路由規則的實現則需要繼承 zend_controller_router_route_abstract抽象類,還必須實現 zend_controller_router_route_inte***ce中的方法。
在zend_controller_router中路由器預設 的實現是zend_controller_router_rewrite,而路由規則的實現則有很多種。在路由器預設的實現中,核心處理位於 zend_controller_router_rewrite的
route方法:
public
在 這個執行過程上,會預設新增乙個zend_controller_router_route_module的路由規則,通過 adddefaultroutes新增,以確保能使用預設路由規則,類似於[module/]controller/action/var1 /value1/var2/value2這種規則。這裡還有一點是需要明確的,當在zend_controller_front中只設定了乙個控制器目錄 時,這個控制器的目錄就是default模組的目錄,而default模組的模組名稱是不用在uri中宣告的。
public
在新增預設路由規則的時候,確保了名為default的路由規則位於陣列的第一位。在route方法中,反轉了路由規則的陣列,以確保名為default 的路由規則位於最後,以確保不會對其它的路由規則造成衝突。然後開始遍歷所有的路由規則,以找到匹配的路由規則並解析出模組名、控制器名、控制器動作名、 引數。並將這些資訊設定到zend_controller_request(本文中是zend_controller_request_http)中。
protected
這樣zend_controller工作流的第乙個主要工作就結束了,之後的事情就交給分發器處理了。路由器的工作僅僅是對輸入進行了解析,然後將模組名、控制器名、控制器動作名、引數資訊,傳遞到請求物件,當然這些也可以對應到非http的應用上。
分發器是zend_controller工作流中第二個元件。分發器的所做的工作就簡單多了,由於在經過路由器後,已經知道了當前請求所需要訪問的模組名、控制器名、控制器動作名,所以zend_controller_dispatcher會自動載入控制器類,然後呼叫控制器類中的dispatch方 法。所有的控制器必須是zend_controller_action的子類,dispatch方法接收乙個控制器動作名的引數。讓我們來看看 zend_controller_dispatcher的dispatch方法中有些什麼:
分發器所做的事情就簡單的多,載入由路由器解析出來的控制器類,然後呼叫控制器類的dispatch方法。
在經過路由器和分發器之後,後面的工作就是呼叫控制器動作了。但由於zend_controller_action有乙個zend_controller_action_helper子系統,所以還會有一些操作。
在 zend_controller_action會對zend_controller_action_helper子系統進行處理,還有自身的 predispatch、postdispatch鉤子操作。這裡有一點非常值得注意的地方,就是在這個處理過程中手動呼叫了__call方法,如果由系 統自動呼叫__call方法的話,非常的慢,我原來做過乙個測試,通過自動呼叫要比顯示呼叫慢一半左右。
zend_controller_action_helper_viewrenderer 助手是預設載入的,該助手用於自動呼叫zend_view 的render操作。而實現的機制就是使用了zend_controller_action_helper的postdispatch方法:
public
在zend_controller_action系統中還有自身的predispatch、postdispatch、init方法,這些都提供了更多的途徑來干擾控制器的執行過程。
在zend_controller的工作流過程中,在每乙個階段都會執行一些方法,總共分為6個階段,在流程圖中**的部分。這些方法通過zend_controller_plugin外掛程式機制來完成,關於外掛程式機制的使用將會用該系列文章的第三部分進行說明。
zend_controller的架構是非常優秀的,在zend_controller的工作流中,各方面的工作被細化,達到極為可控的層度。了解zend_controller工作流的細節後,可以通過所提供的可控性,來開發更高效的應用。
container of 的的的原理
另外一篇,同樣精彩,揭開linux核心中container of的神秘面紗 華清遠見嵌入式學院講師。在linux 核心中有乙個大名鼎鼎的巨集container of 這個巨集是用來幹嘛的呢?我們先來看看它在核心中是怎樣定義的。呵呵,乍一看不知道是什麼東東。我們先來分析一下container of p...
存在的就是合理的,發生的即是必然的。
筆者有時候會想,什麼是對,什麼是錯?對於追求某一件事情之前首先會考慮,為什麼我要做這件事情。所以經過自我分析和生活周邊環境的總結。我認為,對於乙個人來,這是在站在個體的角度上說。什麼是對的?就是你自己覺得是對的,它就是對的。不過這個只是你自己的想法。主觀上的正確,不代表客觀上也受到了別人的認可。就拿...
Apache的rewrite的重寫相關的引數
apache mod rewrite規則重寫的標誌一覽 使用mod rewrite時常用的伺服器變數 rewriterule規則表示式的說明 匹配任何單字元 chars 匹配字串 chars chars 不匹配字串 chars text1 text2 可選擇的字串 text1或text2 匹配0到1...