接着上面的一篇
把代碼貼上來
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<code>$front = zend_controller_front::getinstance();</code>
<code>zend_layout::startmvc(array(</code><code>'layoutpath'</code> <code>=> usvn_layouts_dir));</code>
<code>$front->setrequest(</code><code>new</code> <code>zend_controller_request_http());</code>
<code>$front->throwexceptions(</code><code>true</code><code>);</code>
<code>$front->setbaseurl($config->url-></code><code>base</code><code>);</code>
<code>$router = </code><code>new</code> <code>zend_controller_router_rewrite();</code>
<code>$routes_config = </code><code>new</code> <code>usvn_config_ini(usvn_routes_config_file, usvn_config_section);</code>
<code>$router->addconfig($routes_config, </code><code>'routes'</code><code>);</code>
<code>$front->setrouter($router);</code>
<code>$front->setcontrollerdirectory(usvn_controllers_dir);</code>
<code>$front->dispatch();</code>
上一篇把前兩句getinstance和startmvc兩個函數已經讀完了,下面是繼續分析後面的代碼
setrequest($request) 這裡是判斷request是否是繼承自zend_controller_request_abstract,如果是的話就把front的_request指派為它。
這裡需要了解下什麼是zend_controller_request_abstract,它是所有request抽象出來的抽象類。zend已經提供了兩個實作類,zend_controller_request_http和zend_controller_request_simple,一般我們搭建伺服器都是http請求,是以你的項目如果需要重新繼承的話,一般都直接繼承zend_controller_request_http。
zend_controller_request_http中我們經常會使用到的getquery,getcookie,getrequesturi,getbasepath,getparams,getheader等這些http通常的選項都已經有了。
繼續講它的基類zend_controller_request_abstract,這個類的方法包含:

回到代碼
front−>setrequest(newzendcontrollerrequesthttp());這裡調用了zendcontrollerrequesthttp的構造函數,構造函數在第一次調用的時候是front−>setrequest(newzendcontrollerrequesthttp());這裡調用了zendcontrollerrequesthttp的構造函數,構造函數在第一次調用的時候是this->setrequesturi();其中的setrequesturi很多都是直接使用$_server這個php全局變量中的資料來擷取requesturi的。
$front->throwexceptions(true); 将内部的_throwexceptions标志位設定為true;
$front->setbaseurl("/usvn")這個做了兩件事情,首先是設定front内部的_baseurl屬性,其次調用request的setbaseurl,也是設定zend_controller_request_http的内部_baseurl屬性。
$router = new zend_controller_router_rewrite();
$routes_config = new usvn_config_ini(usvn_routes_config_file, usvn_config_section);
router−>addconfig(router−>addconfig(routes_config, 'routes');
front−>setrouter(front−>setrouter(router);
下面這三行就直接說,實際上就是使用zend的router子產品使用配置檔案,router使用setrouter放入front裡面。
最後一句
$front->dispatch();
這個函數也是最核心的一個函數。
這個函數首先注冊了一個插件zend_controller_plugin_errorhandler,index為100,把插件的順序放在最後。
第二步存放了一個helper,zend_controller_action_helper_viewrenderer,index為-80
下面執行個體化了request,request是一個zend_controller_request_http類型。并将request的baseurl設定為前面設定過的_baseurl,就是"/usvn/item/usvn_test"
接着執行個體化了response,response是一個zend_controller_response_http();
下面使用plugins來對request和response進行設定,首先實際調用了zend_controller_plugin_broker的setrequest函數,這個函數循環周遊broker管理的所有插件,調用插件的setrequest($request)函數(如果有的話)。
接下來初始化router,和設定router的參數。router已經在前面設定過了,就是zend_controller_router_rewrite類型
初始化分發器dispatcher,分發器我們是第一次看到,zend_controller_dispatcher_standard類。分發器以後再說。
下面的流程:
調用插件的routestartup對request進行處理
調用router的route處理request
調用插件的routeshutdown對request進行處理
調用插件的dispatchloopstartup對request進行處理
進入循環分發過程
調用插件的predispatch對request進行處理
調用dispatcher的dispatch處理request和response
調用插件的postdispatch對request進行處理
跳出循環分發過程
調用插件的dispatchloopshutdown對request進行處理
發送response