Zend的MVC机制使用分析(一)_PHP
代码
复制代码 代码如下:
$front = Zend_Controller_Front::getInstance();
Zend_Layout::startMvc(array('layoutPath' => USVN_LAYOUTS_DIR));
$front->setRequest(new USVN_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);
Zend_Controller_Front::getInstance()->dispatch();
分析
首先看下Zend_Controller_Front::getInstance是调用单例模式,实例化了它的内部属性_plugins,实例化了一个Zend_Controller_Plugin_Broker类。
这个类是管理front的插件的类。先看一个Front中的方法public function registerPlugin(Zend_Controller_Plugin_Abstract $plugin, $stackIndex = null)
意思是如果你有一个自己的插件要插入使用的话,调用这个函数能把你自己的插件委托给Zend_Controller_Plugin_Broker使用。
如果你有愿望继续跟下去你会看到注册插件做的一件最根本的事情就是把request和response放入到你的插件中去(setRequest和setResponse)。
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,我们这个例子中是传递进来Array ( [layoutPath] => /var/www/html/usvn/app/layouts )这个array作为options,构造函数就是调用$this->setOptions($options);
这个setOptions做的事是根据array的每个key,调用$this->set$key($val);也就是说,以上面的例子来说,setOptions调用了setLayoutPath("/var/www/html/usvn/app/layouts")
顺藤摸瓜,setLayoutPath的功能是设置自己类的this->_layout为"/var/www/html/usvn/app/layouts", 然后设置_enable为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),
99
);
记得前面对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的构造函数就这样分析结束了。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

引言在當今快速發展的數位世界中,建立健壯、靈活且可維護的WEB應用程式至關重要。 PHPmvc架構提供了實現這一目標的理想解決方案。 MVC(模型-視圖-控制器)是一種廣泛使用的設計模式,可將應用程式的各個方面分離為獨立的元件。 MVC架構的基礎MVC架構的核心原理是分離關注點:模型:封裝應用程式的資料和業務邏輯。視圖:負責呈現資料並處理使用者互動。控制器:協調模型和視圖之間的交互,管理使用者請求和業務邏輯。 PHPMVC架構phpMVC架構遵循傳統MVC模式,但也引進了語言特定的功能。以下是PHPMVC

mvc架構(模型-視圖-控制器)是PHP開發中最受歡迎的模式之一,因為它為組織程式碼和簡化WEB應用程式的開發提供了清晰的結構。雖然基本的MVC原理對於大多數Web應用程式來說已經足夠,但對於需要處理複雜資料或實現高級功能的應用程序,它存在一些限制。分離模型層分離模型層是高階MVC架構常見的技術。它涉及將模型類分解為較小的子類,每個子類專注於特定功能。例如,對於一個電子商務應用程序,您可以將主模型類別分解為訂單模型、產品模型和客戶模型。這種分離有助於提高程式碼的可維護性和可重複使用性。使用依賴注入依賴

PHP實作框架:ZendFramework入門教學ZendFramework是PHP開發的開源網站框架,目前由ZendTechnologies維護,ZendFramework採用了MVC設計模式,提供了一系列可重複使用的程式碼庫,服務於實作Web2.0應用程式和Web服務。 ZendFramework深受PHP開發者的歡迎與推崇,擁有廣泛

如何在Zend框架中使用ACL(AccessControlList)進行權限控制導言:在一個Web應用程式中,權限控制是至關重要的功能。它可以確保使用者只能存取其有權存取的頁面和功能,並防止未經授權的存取。 Zend框架提供了一種方便的方法來實現權限控制,即使用ACL(AccessControlList)元件。本文將介紹如何在Zend框架中使用ACL

SpringMVC框架解密:為什麼它如此受歡迎,需要具體程式碼範例引言:在當今的軟體開發領域中,SpringMVC框架已經成為開發者非常喜愛的一種選擇。它是基於MVC架構模式的Web框架,提供了靈活、輕量、高效的開發方式。本文將深入探討SpringMVC框架的魅力所在,並透過具體的程式碼範例來展示其強大之處。一、SpringMVC框架的優勢靈活的配置方式Spr

MVC(Model-View-Controller)模式是一種常用的軟體設計模式,可以幫助開發人員更好地組織和管理程式碼。 MVC模式將應用程式分為三個部分:模型(Model)、視圖(View)和控制器(Controller),每個部分都有自己的角色和職責。在本文中,我們將討論如何使用PHP實作MVC模式。模型(Model)模型代表應用程式的資料和資料處理。通常,

如何在PHP8框架中實現可擴展的MVC架構引言:隨著互聯網的快速發展,越來越多的網站和應用程式採用了MVC(Model-View-Controller)架構模式。 MVC架構的主要目標是將應用程式的不同部分分開,以便提高程式碼的可維護性和可擴展性。在本文中,我們將介紹如何在PHP8框架中實現可擴充的MVC架構。一、了解MVC架構模式MVC架構模式是一種軟體設

在Web開發中,MVC(Model-View-Controller)是一種常用的架構模式,用於處理和管理應用程式的資料、使用者介面和控制邏輯。 PHP作為流行的Web開發語言,也可以藉助MVC架構設計和建構Web應用程式。本文將介紹如何在PHP中使用MVC架構設計項目,並說明其優點和注意事項。什麼是MVCMVC是一種軟體架構模式,通常用於Web應用程式中。 MV
