Zend Framework教程之Zend_Controller_Plugin插件用法详解
|
本文实例讲述了Zend Framework教程之Zend_Controller_Plugin插件用法。分享给大家供大家参考,具体如下: 通过Zend_Controller_Plugin可以向前端控制器增加附加的功能。便于w一些特殊功能。以下是Zend_Controller_Plugin的简单介绍。 Zend_Controller_Plugin的基本实现
Zend_Controller_Plugin_Abstract_request = $request; return $this; } public function getRequest() { return $this->_request; } public function setResponse(Zend_Controller_Response_Abstract $response) { $this->_response = $response; return $this; } public function getResponse() { return $this->_response; } /** * Called before Zend_Controller_Front begins evaluating the * request against its routes. * * @param Zend_Controller_Request_Abstract $request * @return void */ public function routeStartup(Zend_Controller_Request_Abstract $request) {} /** * Called after Zend_Controller_Router exits. * * Called after Zend_Controller_Front exits from the router. * * @param Zend_Controller_Request_Abstract $request * @return void */ public function routeShutdown(Zend_Controller_Request_Abstract $request) {} /** * Called before Zend_Controller_Front enters its dispatch loop. * * @param Zend_Controller_Request_Abstract $request * @return void */ public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) {} /** * Called before an action is dispatched by Zend_Controller_Dispatcher. * * This callback allows for proxy or filter behavior. By altering the * request and resetting its dispatched flag (via * {@link Zend_Controller_Request_Abstract::setDispatched() setDispatched(false)}),* the current action may be skipped. * * @param Zend_Controller_Request_Abstract $request * @return void */ public function preDispatch(Zend_Controller_Request_Abstract $request) {} /** * Called after an action is dispatched by Zend_Controller_Dispatcher. * * This callback allows for proxy or filter behavior. By altering the * request and resetting its dispatched flag (via * {@link Zend_Controller_Request_Abstract::setDispatched() setDispatched(false)}),* a new action may be specified for dispatching. * * @param Zend_Controller_Request_Abstract $request * @return void */ public function postDispatch(Zend_Controller_Request_Abstract $request) {} /** * Called before Zend_Controller_Front exits its dispatch loop. * * @return void */ public function dispatchLoopShutdown() {} }Zend_Controller_Plugin_Abstract声明定义了Zend_Controller运行过程中的几个关键事件位置。用户可以通过指定的方法,对指定位置的请求和相应对象进行相关操作。 Zend_Controller_Plugin_Abstract中方法的描述如下:routeStartup() 在 Zend_Controller_Front 向注册的 路由器 发送请求前被调用。 routeShutdown()在 路由器 完成请求的路由后被调用。 dispatchLoopStartup() 在 Zend_Controller_Front 进入其分发循环(dispatch loop)前被调用。 preDispatch() 在动作由 分发器 分发前被调用。该回调方法允许代理或者过滤行为。通过修改请求和重设分发标志位(利用 Zend_Controller_Request_Abstract::setDispatched(false) )当前动作可以跳过或者被替换。 postDispatch() 在动作由 分发器 分发后被调用。该回调方法允许代理或者过滤行为。通过修改请求和重设分发标志位(利用 Zend_Controller_Request_Abstract::setDispatched(false) )可以指定新动作进行分发。 dispatchLoopShutdown() 在 Zend_Controller_Front 推出其分发循环后调用。 Zend_Controller_Plugin提供的默认插件:Zend_Controller_Plugin_Broker:插件经纪人,用于注册,管理自定义的Zend_Controller插件。具体用法,可以参考类代码。 Zend_Controller_Plugin_ActionStack:用于管理动作堆栈。具体用法,可以参考类代码。 Zend_Controller_Plugin_ErrorHandler:用来处理抛出的异常。具体用法,可以参考类代码。 Zend_Controller_Plugin_PutHandler:用于处理请求操作 PUT 。具体用法,可以参考类代码。 Zend_Controller_Plugin_Broker_plugins,true)) {
require_once 'Zend/Controller/Exception.php';
throw new Zend_Controller_Exception('Plugin already registered');
}
$stackIndex = (int) $stackIndex;
if ($stackIndex) {
if (isset($this->_plugins[$stackIndex])) {
require_once 'Zend/Controller/Exception.php';
throw new Zend_Controller_Exception('Plugin with stackIndex "' . $stackIndex . '" already registered');
}
$this->_plugins[$stackIndex] = $plugin;
} else {
$stackIndex = count($this->_plugins);
while (isset($this->_plugins[$stackIndex])) {
++$stackIndex;
}
$this->_plugins[$stackIndex] = $plugin;
}
$request = $this->getRequest();
if ($request) {
$this->_plugins[$stackIndex]->setRequest($request);
}
$response = $this->getResponse();
if ($response) {
$this->_plugins[$stackIndex]->setResponse($response);
}
ksort($this->_plugins);
return $this;
}
/**
* Unregister a plugin.
*
* @param string|Zend_Controller_Plugin_Abstract $plugin Plugin object or class name
* @return Zend_Controller_Plugin_Broker
*/
public function unregisterPlugin($plugin)
{
if ($plugin instanceof Zend_Controller_Plugin_Abstract) {
// Given a plugin object,find it in the array
$key = array_search($plugin,true);
if (false === $key) {
require_once 'Zend/Controller/Exception.php';
throw new Zend_Controller_Exception('Plugin never registered.');
}
unset($this->_plugins[$key]);
} elseif (is_string($plugin)) {
// Given a plugin class,find all plugins of that class and unset them
foreach ($this->_plugins as $key => $_plugin) {
$type = get_class($_plugin);
if ($plugin == $type) {
unset($this->_plugins[$key]);
}
}
}
return $this;
}
/**
* Is a plugin of a particular class registered?
*
* @param string $class
* @return bool
*/
public function hasPlugin($class)
{
foreach ($this->_plugins as $plugin) {
$type = get_class($plugin);
if ($class == $type) {
return true;
}
}
return false;
}
/**
* Retrieve a plugin or plugins by class
*
* @param string $class Class name of plugin(s) desired
* @return false|Zend_Controller_Plugin_Abstract|array Returns false if none found,plugin if only one found,and array of plugins if multiple plugins of same class found
*/
public function getPlugin($class)
{
$found = array();
foreach ($this->_plugins as $plugin) {
$type = get_class($plugin);
if ($class == $type) {
$found[] = $plugin;
}
}
switch (count($found)) {
case 0:
return false;
case 1:
return $found[0];
default:
return $found;
}
}
/**
* Retrieve all plugins
*
* @return array
*/
public function getPlugins()
{
return $this->_plugins;
}
/**
* Set request object,and register with each plugin
*
* @param Zend_Controller_Request_Abstract $request
* @return Zend_Controller_Plugin_Broker
*/
public function setRequest(Zend_Controller_Request_Abstract $request)
{
$this->_request = $request;
foreach ($this->_plugins as $plugin) {
$plugin->setRequest($request);
}
return $this;
}
/**
* Get request object
*
* @return Zend_Controller_Request_Abstract $request
*/
public function getRequest()
{
return $this->_request;
}
/**
* Set response object
*
* @param Zend_Controller_Response_Abstract $response
* @return Zend_Controller_Plugin_Broker
*/
public function setResponse(Zend_Controller_Response_Abstract $response)
{
$this->_response = $response;
foreach ($this->_plugins as $plugin) {
$plugin->setResponse($response);
}
return $this;
}
/**
* Get response object
*
* @return Zend_Controller_Response_Abstract $response
*/
public function getResponse()
{
return $this->_response;
}
/**
* Called before Zend_Controller_Front begins evaluating the
* request against its routes.
*
* @param Zend_Controller_Request_Abstract $request
* @return void
*/
public function routeStartup(Zend_Controller_Request_Abstract $request)
{
foreach ($this->_plugins as $plugin) {
try {
$plugin->routeStartup($request);
} catch (Exception $e) {
if (Zend_Controller_Front::getInstance()->throwExceptions()) {
throw new Zend_Controller_Exception($e->getMessage() . $e->getTraceAsString(),$e->getCode(),$e);
} else {
$this->getResponse()->setException($e);
}
}
}
}
/**
* Called before Zend_Controller_Front exits its iterations over
* the route set.
*
* @param Zend_Controller_Request_Abstract $request
* @return void
*/
public function routeShutdown(Zend_Controller_Request_Abstract $request)
{
foreach ($this->_plugins as $plugin) {
try {
$plugin->routeShutdown($request);
} catch (Exception $e) {
if (Zend_Controller_Front::getInstance()->throwExceptions()) {
throw new Zend_Controller_Exception($e->getMessage() . $e->getTraceAsString(),$e);
} else {
$this->getResponse()->setException($e);
}
}
}
}
/**
* Called before Zend_Controller_Front enters its dispatch loop.
*
* During the dispatch loop,Zend_Controller_Front keeps a
* Zend_Controller_Request_Abstract object,and uses
* Zend_Controller_Dispatcher to dispatch the
* Zend_Controller_Request_Abstract object to controllers/actions.
*
* @param Zend_Controller_Request_Abstract $request
* @return void
*/
public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
foreach ($this->_plugins as $plugin) {
try {
$plugin->dispatchLoopStartup($request);
} catch (Exception $e) {
if (Zend_Controller_Front::getInstance()->throwExceptions()) {
throw new Zend_Controller_Exception($e->getMessage() . $e->getTraceAsString(),$e);
} else {
$this->getResponse()->setException($e);
}
}
}
}
/**
* Called before an action is dispatched by Zend_Controller_Dispatcher.
*
* @param Zend_Controller_Request_Abstract $request
* @return void
*/
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
foreach ($this->_plugins as $plugin) {
try {
$plugin->preDispatch($request);
} catch (Exception $e) {
if (Zend_Controller_Front::getInstance()->throwExceptions()) {
throw new Zend_Controller_Exception($e->getMessage() . $e->getTraceAsString(),$e);
} else {
$this->getResponse()->setException($e);
// skip rendering of normal dispatch give the error handler a try
$this->getRequest()->setDispatched(false);
}
}
}
}
/**
* Called after an action is dispatched by Zend_Controller_Dispatcher.
*
* @param Zend_Controller_Request_Abstract $request
* @return void
*/
public function postDispatch(Zend_Controller_Request_Abstract $request)
{
foreach ($this->_plugins as $plugin) {
try {
$plugin->postDispatch($request);
} catch (Exception $e) {
if (Zend_Controller_Front::getInstance()->throwExceptions()) {
throw new Zend_Controller_Exception($e->getMessage() . $e->getTraceAsString(),$e);
} else {
$this->getResponse()->setException($e);
}
}
}
}
/**
* Called before Zend_Controller_Front exits its dispatch loop.
*
* @param Zend_Controller_Request_Abstract $request
* @return void
*/
public function dispatchLoopShutdown()
{
foreach ($this->_plugins as $plugin) {
try {
$plugin->dispatchLoopShutdown();
} catch (Exception $e) {
if (Zend_Controller_Front::getInstance()->throwExceptions()) {
throw new Zend_Controller_Exception($e->getMessage() . $e->getTraceAsString(),$e);
} else {
$this->getResponse()->setException($e);
}
}
}
}
}
(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
