Zend的MVC機制流量分析(二)_PHP教程

來源:互聯網
上載者:User
接著上面的一篇


把代碼貼上來
複製代碼 代碼如下:
$front = Zend_Controller_Front::getInstance();
Zend_Layout::startMvc(array('layoutPath' => USVN_LAYOUTS_DIR));

$front->setRequest(new Zend_Controller_Request_Http());
$front->throwExceptions(true);
$front->setBaseUrl($config->url->base);

$router = new Zend_Controller_Router_Rewrite();
$routes_config = new USVN_Config_Ini(USVN_ROUTES_CONFIG_FILE, USVN_CONFIG_SECTION);
$router->addConfig($routes_config, 'routes');
$front->setRouter($router);
$front->setControllerDirectory(USVN_CONTROLLERS_DIR);

$front->dispatch();

上一篇把前兩句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(new Zend_Controller_Request_Http());這裡調用了Zend_Controller_Request_Http的建構函式,建構函式在第一次調用的時候是$this->setRequestUri();其中的setRequestUri很多都是直接使用$_SERVER這個php全域變數中的資料來擷取requestUri的。

setRequestUri可以學到的是在不同的伺服器中如何擷取requestUri(特別是在IIS中的$SERVER中不同的變數組合有不同的含義),比如http://172.23.11.160/usvn/item/usvn_test 這個url,它的requestUri就是/usvn/item/usvn_test

$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($routes_config, 'routes');

$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

http://www.bkjia.com/PHPjc/326856.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/326856.htmlTechArticle接著上面的一篇 把代碼貼上來 複製代碼 代碼如下: $front = Zend_Controller_Front::getInstance(); Zend_Layout::startMvc(array('layoutPath' = USVN_LAYOUTS_DIR)); $f...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.