Zend的MVC機制(一)

2021-09-06 05:37:41 字數 3960 閱讀 7987

首先看下zend_controller_front::getinstance是呼叫單例模式,例項化了它的內部屬性_plugins,例項化了乙個zend_controller_plugin_broker類。

這個類是管理front的外掛程式的類。先看乙個front中的方法public function registerplugin(zend_controller_plugin_abstract $plugin, $stackindex = null)

class zend_controller_plugin_broker extends zend_controller_plugin_abstract

這個實現了抽象類zend_controller_plugin_abstract。

這裡有一系列的文章很不錯

zend_controller_plugin_abstract是所有外掛程式的抽象類,所有使用者自己定義的外掛程式或者zend已有的外掛程式都要從這個類繼承。這裡就看到了,前端控制器front就是使用broker作為使用者外掛程式註冊。

這個抽象類可以被實現的函式有:

routestartup: 在路由傳送請求前被呼叫

routeshutdown:在路由完成請求後被呼叫

dispatchloopstartup:在進入分發迴圈(dispatch loop)前被呼叫

predispatch:在動作由分發器分發前被呼叫

postdispatch:在動作由路由器分發後被呼叫

dispatchloopshutdown:在進入分發迴圈(dispatch loop)後被呼叫

我們還看到了getrequest, getresponse兩個方法,我們可以通過他們分別從控制器中獲取request物件和response物件

好了,扯遠了,回到最開始的**,zend_controller_front::getinstance實際上來看做的事情就是註冊了乙個broker外掛程式放到$front中。

下面一行**

zend_layout::startmvc(array('layoutpath' => usvn_layouts_dir));

看到zend/layout.php中,startmvc做了兩件事:首先是呼叫自己的建構函式來例項化自己(切記帶著initmvc引數為true),然後是設定引數。

回退到zend_layout的建構函式,初始化options之後是呼叫了_initvarcontainer();

這個函式做了這麼個事情:

$this->_container = zend_view_helper_placeholder_registry::getregistry()->getcontainer(__class__);

又出現了zend_view_helper_placeholder_registry(我翻譯為:zend檢視助手登錄檔)

getregistry() 將zend_view_helper_placeholder_registry作為key,zend_view_helper_placeholder_registry類的例項作為value註冊到之前見過的zend_registry中。這個類的建構函式就什麼事都沒有。

getregistry()返回了zend_view_helper_placeholder_registry例項,下面呼叫getcontainer(__class__)。 這裡的__class__是什麼,當前呼叫的類,自然就是zend_layout了。這裡是getcontainer("zend_layout")

進入到getcontainer裡面,它呼叫了createcontainer("zend_layout")。createcontainer("zend_layout")是在registry中以zend_layout為key,zend_view_helper_placeholder_container類為value的array。

zend_view_helper_placeholder_container實現抽象類zend_view_helper_placeholder_container_abstract,這個抽象類實際上也是乙個arrayobject,這個在之前的文章有提到過了,是乙個和泛型類一樣的東東。

好了,這裡不跟下去了,回頭到zend_layout的建構函式

_initvarcontainer結束了,下面是呼叫兩個重要的函式:

$this->_setmvcenabled(true);

$this->_initmvc();

mvc大家一定很熟悉,我們來看看這裡是怎麼個mvc的

setmvcenabled沒什麼特別,設定標誌位this->_mvcenabled

_initmvc做了兩件事,_initplugin和_inithelper。

先看initplugin:

獲取pluginclass,這裡的pluginclass就是zend_layout_controller_plugin_layout,可以看到,這裡是作為乙個外掛程式的形式放進來的。

接著又獲取了zend_controller_front的例項,呼叫:

$front->registerplugin(

new $pluginclass($this),

記得前面對zend_controller_front的分析不?裡面有registerplugin的函式,是將外掛程式委託給front的broker來用。有人就會問後面的99是什麼意思?是外掛程式的索引順序,越後面的外掛程式越後執行外掛程式的動作。

下面再看_inithelper:

獲取helperclass,這裡的helperclass就是zend_layout_controller_action_helper_layout

if (!zend_controller_action_helperbroker::hashelper('layout')) {

zend_controller_action_helperbroker::getstack()->offsetset(-90, new $helperclass($this));

如果action_helperbroker沒有layout的helper的話

就執行下面的offsetset命令。將-90和zend_layout_controller_action_helper_layout例項作為引數傳入。

和plugin同樣的關係,將zend_layout_controller_action_helper_layout例項作為value存入到this->_helpersbypriority和this->_helpersbynameref去了

前面的-90是權重,也是要保證這個helper是最後呼叫(看最後一行是krsort排序)

好了,layout的建構函式就這樣分析結束了。

Zend的MVC機制(二)

接著上面的一篇 把 貼上來 setrequest request 這裡是判斷request是否是繼承自zend controller request abstract,如果是的話就把front的 request賦值為它。這裡需要了解下什麼是zend controller request abstra...

基於Zend的Captcha機制的應用

如何生成驗證碼?使用php的gd?ok,right。其實zend的captcha模組已經封裝好了。這篇文章就說一下如何使用zend的captcha模組。環境安裝 首先zend的captcha需要安裝gd。檢視有沒有安裝gd需要去phpinfo 中看是否有gd模組。注意,有可能出現php m裡面的模組...

MVC中的統一驗證機制 續

最近在朋友的建議下,看了另一種驗證方式,事實上就是 例項中提供的實體屬性驗證方式,為每個檢視加乙個檢視模型,對檢視模型中的屬性進行特性的 約束即可。具體如下 web ui可能是這樣 using html.beginform model可能是這樣 namespace web.models range ...