File indexing completed on 2024-12-22 05:36:33
0001 <?php 0002 /** 0003 * Zend Framework 0004 * 0005 * LICENSE 0006 * 0007 * This source file is subject to the new BSD license that is bundled 0008 * with this package in the file LICENSE.txt. 0009 * It is also available through the world-wide-web at this URL: 0010 * http://framework.zend.com/license/new-bsd 0011 * If you did not receive a copy of the license and are unable to 0012 * obtain it through the world-wide-web, please send an email 0013 * to license@zend.com so we can send you a copy immediately. 0014 * 0015 * @category Zend 0016 * @package Zend_Controller 0017 * @subpackage Plugins 0018 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0019 * @license http://framework.zend.com/license/new-bsd New BSD License 0020 * @version $Id$ 0021 */ 0022 0023 /** Zend_Controller_Plugin_Abstract */ 0024 // require_once 'Zend/Controller/Plugin/Abstract.php'; 0025 0026 /** 0027 * @category Zend 0028 * @package Zend_Controller 0029 * @subpackage Plugins 0030 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0031 * @license http://framework.zend.com/license/new-bsd New BSD License 0032 */ 0033 class Zend_Controller_Plugin_Broker extends Zend_Controller_Plugin_Abstract 0034 { 0035 0036 /** 0037 * Array of instance of objects extending Zend_Controller_Plugin_Abstract 0038 * 0039 * @var array 0040 */ 0041 protected $_plugins = array(); 0042 0043 0044 /** 0045 * Register a plugin. 0046 * 0047 * @param Zend_Controller_Plugin_Abstract $plugin 0048 * @param int $stackIndex 0049 * @return Zend_Controller_Plugin_Broker 0050 */ 0051 public function registerPlugin(Zend_Controller_Plugin_Abstract $plugin, $stackIndex = null) 0052 { 0053 if (false !== array_search($plugin, $this->_plugins, true)) { 0054 // require_once 'Zend/Controller/Exception.php'; 0055 throw new Zend_Controller_Exception('Plugin already registered'); 0056 } 0057 0058 $stackIndex = (int) $stackIndex; 0059 0060 if ($stackIndex) { 0061 if (isset($this->_plugins[$stackIndex])) { 0062 // require_once 'Zend/Controller/Exception.php'; 0063 throw new Zend_Controller_Exception('Plugin with stackIndex "' . $stackIndex . '" already registered'); 0064 } 0065 $this->_plugins[$stackIndex] = $plugin; 0066 } else { 0067 $stackIndex = count($this->_plugins); 0068 while (isset($this->_plugins[$stackIndex])) { 0069 ++$stackIndex; 0070 } 0071 $this->_plugins[$stackIndex] = $plugin; 0072 } 0073 0074 $request = $this->getRequest(); 0075 if ($request) { 0076 $this->_plugins[$stackIndex]->setRequest($request); 0077 } 0078 $response = $this->getResponse(); 0079 if ($response) { 0080 $this->_plugins[$stackIndex]->setResponse($response); 0081 } 0082 0083 ksort($this->_plugins); 0084 0085 return $this; 0086 } 0087 0088 /** 0089 * Unregister a plugin. 0090 * 0091 * @param string|Zend_Controller_Plugin_Abstract $plugin Plugin object or class name 0092 * @return Zend_Controller_Plugin_Broker 0093 */ 0094 public function unregisterPlugin($plugin) 0095 { 0096 if ($plugin instanceof Zend_Controller_Plugin_Abstract) { 0097 // Given a plugin object, find it in the array 0098 $key = array_search($plugin, $this->_plugins, true); 0099 if (false === $key) { 0100 // require_once 'Zend/Controller/Exception.php'; 0101 throw new Zend_Controller_Exception('Plugin never registered.'); 0102 } 0103 unset($this->_plugins[$key]); 0104 } elseif (is_string($plugin)) { 0105 // Given a plugin class, find all plugins of that class and unset them 0106 foreach ($this->_plugins as $key => $_plugin) { 0107 $type = get_class($_plugin); 0108 if ($plugin == $type) { 0109 unset($this->_plugins[$key]); 0110 } 0111 } 0112 } 0113 return $this; 0114 } 0115 0116 /** 0117 * Is a plugin of a particular class registered? 0118 * 0119 * @param string $class 0120 * @return bool 0121 */ 0122 public function hasPlugin($class) 0123 { 0124 foreach ($this->_plugins as $plugin) { 0125 $type = get_class($plugin); 0126 if ($class == $type) { 0127 return true; 0128 } 0129 } 0130 0131 return false; 0132 } 0133 0134 /** 0135 * Retrieve a plugin or plugins by class 0136 * 0137 * @param string $class Class name of plugin(s) desired 0138 * @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 0139 */ 0140 public function getPlugin($class) 0141 { 0142 $found = array(); 0143 foreach ($this->_plugins as $plugin) { 0144 $type = get_class($plugin); 0145 if ($class == $type) { 0146 $found[] = $plugin; 0147 } 0148 } 0149 0150 switch (count($found)) { 0151 case 0: 0152 return false; 0153 case 1: 0154 return $found[0]; 0155 default: 0156 return $found; 0157 } 0158 } 0159 0160 /** 0161 * Retrieve all plugins 0162 * 0163 * @return array 0164 */ 0165 public function getPlugins() 0166 { 0167 return $this->_plugins; 0168 } 0169 0170 /** 0171 * Set request object, and register with each plugin 0172 * 0173 * @param Zend_Controller_Request_Abstract $request 0174 * @return Zend_Controller_Plugin_Broker 0175 */ 0176 public function setRequest(Zend_Controller_Request_Abstract $request) 0177 { 0178 $this->_request = $request; 0179 0180 foreach ($this->_plugins as $plugin) { 0181 $plugin->setRequest($request); 0182 } 0183 0184 return $this; 0185 } 0186 0187 /** 0188 * Get request object 0189 * 0190 * @return Zend_Controller_Request_Abstract $request 0191 */ 0192 public function getRequest() 0193 { 0194 return $this->_request; 0195 } 0196 0197 /** 0198 * Set response object 0199 * 0200 * @param Zend_Controller_Response_Abstract $response 0201 * @return Zend_Controller_Plugin_Broker 0202 */ 0203 public function setResponse(Zend_Controller_Response_Abstract $response) 0204 { 0205 $this->_response = $response; 0206 0207 foreach ($this->_plugins as $plugin) { 0208 $plugin->setResponse($response); 0209 } 0210 0211 0212 return $this; 0213 } 0214 0215 /** 0216 * Get response object 0217 * 0218 * @return Zend_Controller_Response_Abstract $response 0219 */ 0220 public function getResponse() 0221 { 0222 return $this->_response; 0223 } 0224 0225 0226 /** 0227 * Called before Zend_Controller_Front begins evaluating the 0228 * request against its routes. 0229 * 0230 * @param Zend_Controller_Request_Abstract $request 0231 * @return void 0232 */ 0233 public function routeStartup(Zend_Controller_Request_Abstract $request) 0234 { 0235 foreach ($this->_plugins as $plugin) { 0236 try { 0237 $plugin->routeStartup($request); 0238 } catch (Exception $e) { 0239 if (Zend_Controller_Front::getInstance()->throwExceptions()) { 0240 throw new Zend_Controller_Exception($e->getMessage() . $e->getTraceAsString(), $e->getCode(), $e); 0241 } else { 0242 $this->getResponse()->setException($e); 0243 } 0244 } 0245 } 0246 } 0247 0248 0249 /** 0250 * Called before Zend_Controller_Front exits its iterations over 0251 * the route set. 0252 * 0253 * @param Zend_Controller_Request_Abstract $request 0254 * @return void 0255 */ 0256 public function routeShutdown(Zend_Controller_Request_Abstract $request) 0257 { 0258 foreach ($this->_plugins as $plugin) { 0259 try { 0260 $plugin->routeShutdown($request); 0261 } catch (Exception $e) { 0262 if (Zend_Controller_Front::getInstance()->throwExceptions()) { 0263 throw new Zend_Controller_Exception($e->getMessage() . $e->getTraceAsString(), $e->getCode(), $e); 0264 } else { 0265 $this->getResponse()->setException($e); 0266 } 0267 } 0268 } 0269 } 0270 0271 0272 /** 0273 * Called before Zend_Controller_Front enters its dispatch loop. 0274 * 0275 * During the dispatch loop, Zend_Controller_Front keeps a 0276 * Zend_Controller_Request_Abstract object, and uses 0277 * Zend_Controller_Dispatcher to dispatch the 0278 * Zend_Controller_Request_Abstract object to controllers/actions. 0279 * 0280 * @param Zend_Controller_Request_Abstract $request 0281 * @return void 0282 */ 0283 public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) 0284 { 0285 foreach ($this->_plugins as $plugin) { 0286 try { 0287 $plugin->dispatchLoopStartup($request); 0288 } catch (Exception $e) { 0289 if (Zend_Controller_Front::getInstance()->throwExceptions()) { 0290 throw new Zend_Controller_Exception($e->getMessage() . $e->getTraceAsString(), $e->getCode(), $e); 0291 } else { 0292 $this->getResponse()->setException($e); 0293 } 0294 } 0295 } 0296 } 0297 0298 0299 /** 0300 * Called before an action is dispatched by Zend_Controller_Dispatcher. 0301 * 0302 * @param Zend_Controller_Request_Abstract $request 0303 * @return void 0304 */ 0305 public function preDispatch(Zend_Controller_Request_Abstract $request) 0306 { 0307 foreach ($this->_plugins as $plugin) { 0308 try { 0309 $plugin->preDispatch($request); 0310 } catch (Exception $e) { 0311 if (Zend_Controller_Front::getInstance()->throwExceptions()) { 0312 throw new Zend_Controller_Exception($e->getMessage() . $e->getTraceAsString(), $e->getCode(), $e); 0313 } else { 0314 $this->getResponse()->setException($e); 0315 // skip rendering of normal dispatch give the error handler a try 0316 $this->getRequest()->setDispatched(false); 0317 } 0318 } 0319 } 0320 } 0321 0322 0323 /** 0324 * Called after an action is dispatched by Zend_Controller_Dispatcher. 0325 * 0326 * @param Zend_Controller_Request_Abstract $request 0327 * @return void 0328 */ 0329 public function postDispatch(Zend_Controller_Request_Abstract $request) 0330 { 0331 foreach ($this->_plugins as $plugin) { 0332 try { 0333 $plugin->postDispatch($request); 0334 } catch (Exception $e) { 0335 if (Zend_Controller_Front::getInstance()->throwExceptions()) { 0336 throw new Zend_Controller_Exception($e->getMessage() . $e->getTraceAsString(), $e->getCode(), $e); 0337 } else { 0338 $this->getResponse()->setException($e); 0339 } 0340 } 0341 } 0342 } 0343 0344 0345 /** 0346 * Called before Zend_Controller_Front exits its dispatch loop. 0347 * 0348 * @param Zend_Controller_Request_Abstract $request 0349 * @return void 0350 */ 0351 public function dispatchLoopShutdown() 0352 { 0353 foreach ($this->_plugins as $plugin) { 0354 try { 0355 $plugin->dispatchLoopShutdown(); 0356 } catch (Exception $e) { 0357 if (Zend_Controller_Front::getInstance()->throwExceptions()) { 0358 throw new Zend_Controller_Exception($e->getMessage() . $e->getTraceAsString(), $e->getCode(), $e); 0359 } else { 0360 $this->getResponse()->setException($e); 0361 } 0362 } 0363 } 0364 } 0365 }