麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > PHP > 正文

Zend Framework教程之分發器Zend_Controller_Dispatcher用法詳解

2024-05-04 23:43:38
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Zend Framework教程之分發器Zend_Controller_Dispatcher用法,結合實例形式詳細分析了分發器Zend_Controller_Dispatcher的結構,功能,使用技巧與相關注意事項,需要的朋友可以參考下
 

本文實例講述了Zend Framework教程之分發器Zend_Controller_Dispatcher用法。分享給大家供大家參考,具體如下:

分發器的具體實現

Zend Framework的分發器Zend_Controller_Dispatcher設計主要有,如下類和接口組成:

├── Dispatcher
│   ├── Abstract.php
│   ├── Exception.php
│   ├── Interface.php
│   └── Standard.php

Zend_Controller_Dispatcher_Interface

定義了分發器提供的基本和標準功能。

interface Zend_Controller_Dispatcher_Interface{  public function formatControllerName($unformatted);  public function formatModuleName($unformatted);  public function formatActionName($unformatted);  public function isDispatchable(Zend_Controller_Request_Abstract $request);  public function setParam($name, $value);  public function setParams(array $params);  public function getParam($name);  public function getParams();  public function clearParams($name = null);  public function setResponse(Zend_Controller_Response_Abstract $response = null);  public function getResponse();  public function addControllerDirectory($path, $args = null);  public function setControllerDirectory($path);  public function getControllerDirectory();  public function dispatch(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response);  public function isValidModule($module);  public function getDefaultModule();  public function getDefaultControllerName();  public function getDefaultAction();}

Zend_Controller_Dispatcher_Abstract

實現了Zend_Controller_Dispatcher_Interface接口,提供了分發器提供的基本和標準功能的抽象父類。

<?php/** Zend_Controller_Dispatcher_Interface */require_once 'Zend/Controller/Dispatcher/Interface.php';abstract class Zend_Controller_Dispatcher_Abstract implements Zend_Controller_Dispatcher_Interface{  protected $_defaultAction = 'index';  protected $_defaultController = 'index';  protected $_defaultModule = 'default';  protected $_frontController;  protected $_invokeParams = array();  protected $_pathDelimiter = '_';  protected $_response = null;  protected $_wordDelimiter = array('-', '.');  public function __construct(array $params = array())  {    $this->setParams($params);  }  public function formatControllerName($unformatted)  {    return ucfirst($this->_formatName($unformatted)) . 'Controller';  }  public function formatActionName($unformatted)  {    $formatted = $this->_formatName($unformatted, true);    return strtolower(substr($formatted, 0, 1)) . substr($formatted, 1) . 'Action';  }  public function _verifyDelimiter($spec)  {    if (is_string($spec)) {      return (array) $spec;    } elseif (is_array($spec)) {      $allStrings = true;      foreach ($spec as $delim) {        if (!is_string($delim)) {          $allStrings = false;          break;        }      }      if (!$allStrings) {        require_once 'Zend/Controller/Dispatcher/Exception.php';        throw new Zend_Controller_Dispatcher_Exception('Word delimiter array must contain only strings');      }      return $spec;    }    require_once 'Zend/Controller/Dispatcher/Exception.php';    throw new Zend_Controller_Dispatcher_Exception('Invalid word delimiter');  }  public function getWordDelimiter()  {    return $this->_wordDelimiter;  }  public function setWordDelimiter($spec)  {    $spec = $this->_verifyDelimiter($spec);    $this->_wordDelimiter = $spec;    return $this;  }  public function getPathDelimiter()  {    return $this->_pathDelimiter;  }  public function setPathDelimiter($spec)  {    if (!is_string($spec)) {      require_once 'Zend/Controller/Dispatcher/Exception.php';      throw new Zend_Controller_Dispatcher_Exception('Invalid path delimiter');    }    $this->_pathDelimiter = $spec;    return $this;  }  protected function _formatName($unformatted, $isAction = false)  {    // preserve directories    if (!$isAction) {      $segments = explode($this->getPathDelimiter(), $unformatted);    } else {      $segments = (array) $unformatted;    }    foreach ($segments as $key => $segment) {      $segment    = str_replace($this->getWordDelimiter(), ' ', strtolower($segment));      $segment    = preg_replace('/[^a-z0-9 ]/', '', $segment);      $segments[$key] = str_replace(' ', '', ucwords($segment));    }    return implode('_', $segments);  }  public function getFrontController()  {    if (null === $this->_frontController) {      require_once 'Zend/Controller/Front.php';      $this->_frontController = Zend_Controller_Front::getInstance();    }    return $this->_frontController;  }  public function setFrontController(Zend_Controller_Front $controller)  {    $this->_frontController = $controller;    return $this;  }  public function setParam($name, $value)  {    $name = (string) $name;    $this->_invokeParams[$name] = $value;    return $this;  }  public function setParams(array $params)  {    $this->_invokeParams = array_merge($this->_invokeParams, $params);    return $this;  }  public function getParam($name)  {    if(isset($this->_invokeParams[$name])) {      return $this->_invokeParams[$name];    }    return null;  }  public function getParams()  {    return $this->_invokeParams;  }  public function clearParams($name = null)  {    if (null === $name) {      $this->_invokeParams = array();    } elseif (is_string($name) && isset($this->_invokeParams[$name])) {      unset($this->_invokeParams[$name]);    } elseif (is_array($name)) {      foreach ($name as $key) {        if (is_string($key) && isset($this->_invokeParams[$key])) {          unset($this->_invokeParams[$key]);        }      }    }    return $this;  }  public function setResponse(Zend_Controller_Response_Abstract $response = null)  {    $this->_response = $response;    return $this;  }  public function getResponse()  {    return $this->_response;  }  public function setDefaultControllerName($controller)  {    $this->_defaultController = (string) $controller;    return $this;  }  public function getDefaultControllerName()  {    return $this->_defaultController;  }  public function setDefaultAction($action)  {    $this->_defaultAction = (string) $action;    return $this;  }  public function getDefaultAction()  {    return $this->_defaultAction;  }  public function setDefaultModule($module)  {    $this->_defaultModule = (string) $module;    return $this;  }  public function getDefaultModule()  {    return $this->_defaultModule;  }}

Zend_Controller_Dispatcher_Standard

ZendFramework繼承抽象類Zend_Controller_Dispatcher_Abstract,定義了Zend_Controller_Dispatcher_Standard。Zend_Controller_Dispatcher_Standard是ZendFramework提供的基本的分發器,完成了分發功能。

<?php/** Zend_Loader */require_once 'Zend/Loader.php';/** Zend_Controller_Dispatcher_Abstract */require_once 'Zend/Controller/Dispatcher/Abstract.php';class Zend_Controller_Dispatcher_Standard extends Zend_Controller_Dispatcher_Abstract{  protected $_curDirectory;  protected $_curModule;  protected $_controllerDirectory = array();  public function __construct(array $params = array())  {    parent::__construct($params);    $this->_curModule = $this->getDefaultModule();  }  public function addControllerDirectory($path, $module = null)  {    if (null === $module) {      $module = $this->_defaultModule;    }    $module = (string) $module;    $path  = rtrim((string) $path, '///');    $this->_controllerDirectory[$module] = $path;    return $this;  }  public function setControllerDirectory($directory, $module = null)  {    $this->_controllerDirectory = array();    if (is_string($directory)) {      $this->addControllerDirectory($directory, $module);    } elseif (is_array($directory)) {      foreach ((array) $directory as $module => $path) {        $this->addControllerDirectory($path, $module);      }    } else {      require_once 'Zend/Controller/Exception.php';      throw new Zend_Controller_Exception('Controller directory spec must be either a string or an array');    }    return $this;  }  public function getControllerDirectory($module = null)  {    if (null === $module) {      return $this->_controllerDirectory;    }    $module = (string) $module;    if (array_key_exists($module, $this->_controllerDirectory)) {      return $this->_controllerDirectory[$module];    }    return null;  }  public function removeControllerDirectory($module)  {    $module = (string) $module;    if (array_key_exists($module, $this->_controllerDirectory)) {      unset($this->_controllerDirectory[$module]);      return true;    }    return false;  }  public function formatModuleName($unformatted)  {    if (($this->_defaultModule == $unformatted) && !$this->getParam('prefixDefaultModule')) {      return $unformatted;    }    return ucfirst($this->_formatName($unformatted));  }  public function formatClassName($moduleName, $className)  {    return $this->formatModuleName($moduleName) . '_' . $className;  }  public function classToFilename($class)  {    return str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';  }  public function isDispatchable(Zend_Controller_Request_Abstract $request)  {    $className = $this->getControllerClass($request);    if (!$className) {      return false;    }    $finalClass = $className;    if (($this->_defaultModule != $this->_curModule)      || $this->getParam('prefixDefaultModule'))    {      $finalClass = $this->formatClassName($this->_curModule, $className);    }    if (class_exists($finalClass, false)) {      return true;    }    $fileSpec  = $this->classToFilename($className);    $dispatchDir = $this->getDispatchDirectory();    $test    = $dispatchDir . DIRECTORY_SEPARATOR . $fileSpec;    return Zend_Loader::isReadable($test);  }  public function dispatch(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response)  {    $this->setResponse($response);    /**     * Get controller class     */    if (!$this->isDispatchable($request)) {      $controller = $request->getControllerName();      if (!$this->getParam('useDefaultControllerAlways') && !empty($controller)) {        require_once 'Zend/Controller/Dispatcher/Exception.php';        throw new Zend_Controller_Dispatcher_Exception('Invalid controller specified (' . $request->getControllerName() . ')');      }      $className = $this->getDefaultControllerClass($request);    } else {      $className = $this->getControllerClass($request);      if (!$className) {        $className = $this->getDefaultControllerClass($request);      }    }    /**     * Load the controller class file     */    $className = $this->loadClass($className);    /**     * Instantiate controller with request, response, and invocation     * arguments; throw exception if it's not an action controller     */    $controller = new $className($request, $this->getResponse(), $this->getParams());    if (!($controller instanceof Zend_Controller_Action_Interface) &&      !($controller instanceof Zend_Controller_Action)) {      require_once 'Zend/Controller/Dispatcher/Exception.php';      throw new Zend_Controller_Dispatcher_Exception(        'Controller "' . $className . '" is not an instance of Zend_Controller_Action_Interface'      );    }    /**     * Retrieve the action name     */    $action = $this->getActionMethod($request);    /**     * Dispatch the method call     */    $request->setDispatched(true);    // by default, buffer output    $disableOb = $this->getParam('disableOutputBuffering');    $obLevel  = ob_get_level();    if (empty($disableOb)) {      ob_start();    }    try {      $controller->dispatch($action);    } catch (Exception $e) {      // Clean output buffer on error      $curObLevel = ob_get_level();      if ($curObLevel > $obLevel) {        do {          ob_get_clean();          $curObLevel = ob_get_level();        } while ($curObLevel > $obLevel);      }      throw $e;    }    if (empty($disableOb)) {      $content = ob_get_clean();      $response->appendBody($content);    }    // Destroy the page controller instance and reflection objects    $controller = null;  }  public function loadClass($className)  {    $finalClass = $className;    if (($this->_defaultModule != $this->_curModule)      || $this->getParam('prefixDefaultModule'))    {      $finalClass = $this->formatClassName($this->_curModule, $className);    }    if (class_exists($finalClass, false)) {      return $finalClass;    }    $dispatchDir = $this->getDispatchDirectory();    $loadFile  = $dispatchDir . DIRECTORY_SEPARATOR . $this->classToFilename($className);    if (Zend_Loader::isReadable($loadFile)) {      include_once $loadFile;    } else {      require_once 'Zend/Controller/Dispatcher/Exception.php';      throw new Zend_Controller_Dispatcher_Exception('Cannot load controller class "' . $className . '" from file "' . $loadFile . "'");    }    if (!class_exists($finalClass, false)) {      require_once 'Zend/Controller/Dispatcher/Exception.php';      throw new Zend_Controller_Dispatcher_Exception('Invalid controller class ("' . $finalClass . '")');    }    return $finalClass;  }  public function getControllerClass(Zend_Controller_Request_Abstract $request)  {    $controllerName = $request->getControllerName();    if (empty($controllerName)) {      if (!$this->getParam('useDefaultControllerAlways')) {        return false;      }      $controllerName = $this->getDefaultControllerName();      $request->setControllerName($controllerName);    }    $className = $this->formatControllerName($controllerName);    $controllerDirs   = $this->getControllerDirectory();    $module = $request->getModuleName();    if ($this->isValidModule($module)) {      $this->_curModule  = $module;      $this->_curDirectory = $controllerDirs[$module];    } elseif ($this->isValidModule($this->_defaultModule)) {      $request->setModuleName($this->_defaultModule);      $this->_curModule  = $this->_defaultModule;      $this->_curDirectory = $controllerDirs[$this->_defaultModule];    } else {      require_once 'Zend/Controller/Exception.php';      throw new Zend_Controller_Exception('No default module defined for this application');    }    return $className;  }  public function isValidModule($module)  {    if (!is_string($module)) {      return false;    }    $module    = strtolower($module);    $controllerDir = $this->getControllerDirectory();    foreach (array_keys($controllerDir) as $moduleName) {      if ($module == strtolower($moduleName)) {        return true;      }    }    return false;  }  public function getDefaultControllerClass(Zend_Controller_Request_Abstract $request)  {    $controller = $this->getDefaultControllerName();    $default  = $this->formatControllerName($controller);    $request->setControllerName($controller)        ->setActionName(null);    $module       = $request->getModuleName();    $controllerDirs   = $this->getControllerDirectory();    $this->_curModule  = $this->_defaultModule;    $this->_curDirectory = $controllerDirs[$this->_defaultModule];    if ($this->isValidModule($module)) {      $found = false;      if (class_exists($default, false)) {        $found = true;      } else {        $moduleDir = $controllerDirs[$module];        $fileSpec = $moduleDir . DIRECTORY_SEPARATOR . $this->classToFilename($default);        if (Zend_Loader::isReadable($fileSpec)) {          $found = true;          $this->_curDirectory = $moduleDir;        }      }      if ($found) {        $request->setModuleName($module);        $this->_curModule  = $this->formatModuleName($module);      }    } else {      $request->setModuleName($this->_defaultModule);    }    return $default;  }  public function getDispatchDirectory()  {    return $this->_curDirectory;  }  public function getActionMethod(Zend_Controller_Request_Abstract $request)  {    $action = $request->getActionName();    if (empty($action)) {      $action = $this->getDefaultAction();      $request->setActionName($action);    }    return $this->formatActionName($action);  }}

前端控制器和分發器

<?php/** Zend_Loader */require_once 'Zend/Loader.php';/** Zend_Controller_Action_HelperBroker */require_once 'Zend/Controller/Action/HelperBroker.php';/** Zend_Controller_Plugin_Broker */require_once 'Zend/Controller/Plugin/Broker.php';class Zend_Controller_Front{  protected $_baseUrl = null;  protected $_controllerDir = null;  protected $_dispatcher = null;  protected static $_instance = null;  protected $_invokeParams = array();  protected $_moduleControllerDirectoryName = 'controllers';  protected $_plugins = null;  protected $_request = null;  protected $_response = null;  protected $_returnResponse = false;  protected $_router = null;  protected $_throwExceptions = false;  protected function __construct()  {    $this->_plugins = new Zend_Controller_Plugin_Broker();  }  private function __clone()  {  }  public static function getInstance()  {    if (null === self::$_instance) {      self::$_instance = new self();    }    return self::$_instance;  }  public function resetInstance()  {    $reflection = new ReflectionObject($this);    foreach ($reflection->getProperties() as $property) {      $name = $property->getName();      switch ($name) {        case '_instance':          break;        case '_controllerDir':        case '_invokeParams':          $this->{$name} = array();          break;        case '_plugins':          $this->{$name} = new Zend_Controller_Plugin_Broker();          break;        case '_throwExceptions':        case '_returnResponse':          $this->{$name} = false;          break;        case '_moduleControllerDirectoryName':          $this->{$name} = 'controllers';          break;        default:          $this->{$name} = null;          break;      }    }    Zend_Controller_Action_HelperBroker::resetHelpers();  }  public static function run($controllerDirectory)  {    self::getInstance()      ->setControllerDirectory($controllerDirectory)      ->dispatch();  }  public function addControllerDirectory($directory, $module = null)  {    $this->getDispatcher()->addControllerDirectory($directory, $module);    return $this;  }  public function setControllerDirectory($directory, $module = null)  {    $this->getDispatcher()->setControllerDirectory($directory, $module);    return $this;  }  public function getControllerDirectory($name = null)  {    return $this->getDispatcher()->getControllerDirectory($name);  }  public function removeControllerDirectory($module)  {    return $this->getDispatcher()->removeControllerDirectory($module);  }  public function addModuleDirectory($path)  {    try{      $dir = new DirectoryIterator($path);    } catch(Exception $e) {      require_once 'Zend/Controller/Exception.php';      throw new Zend_Controller_Exception("Directory $path not readable", 0, $e);    }    foreach ($dir as $file) {      if ($file->isDot() || !$file->isDir()) {        continue;      }      $module  = $file->getFilename();      // Don't use SCCS directories as modules      if (preg_match('/^[^a-z]/i', $module) || ('CVS' == $module)) {        continue;      }      $moduleDir = $file->getPathname() . DIRECTORY_SEPARATOR . $this->getModuleControllerDirectoryName();      $this->addControllerDirectory($moduleDir, $module);    }    return $this;  }  public function getModuleDirectory($module = null)  {    if (null === $module) {      $request = $this->getRequest();      if (null !== $request) {        $module = $this->getRequest()->getModuleName();      }      if (empty($module)) {        $module = $this->getDispatcher()->getDefaultModule();      }    }    $controllerDir = $this->getControllerDirectory($module);    if ((null === $controllerDir) || !is_string($controllerDir)) {      return null;    }    return dirname($controllerDir);  }  public function setModuleControllerDirectoryName($name = 'controllers')  {    $this->_moduleControllerDirectoryName = (string) $name;    return $this;  }  public function getModuleControllerDirectoryName()  {    return $this->_moduleControllerDirectoryName;  }  public function setDefaultControllerName($controller)  {    $dispatcher = $this->getDispatcher();    $dispatcher->setDefaultControllerName($controller);    return $this;  }  public function getDefaultControllerName()  {    return $this->getDispatcher()->getDefaultControllerName();  }  public function setDefaultAction($action)  {    $dispatcher = $this->getDispatcher();    $dispatcher->setDefaultAction($action);    return $this;  }  public function getDefaultAction()  {    return $this->getDispatcher()->getDefaultAction();  }  public function setDefaultModule($module)  {    $dispatcher = $this->getDispatcher();    $dispatcher->setDefaultModule($module);    return $this;  }  public function getDefaultModule()  {    return $this->getDispatcher()->getDefaultModule();  }  public function setRequest($request)  {    ...........................    return $this;  }  public function getRequest()  {    return $this->_request;  }  public function setRouter($router)  {    ....................    return $this;  }  public function getRouter()  {    ..................    return $this->_router;  }  public function setBaseUrl($base = null)  {    ..............    return $this;  }  public function getBaseUrl()  {    return $this->_baseUrl;  }  /**   * Set the dispatcher object. The dispatcher is responsible for   * taking a Zend_Controller_Dispatcher_Token object, instantiating the controller, and   * call the action method of the controller.   *   * @param Zend_Controller_Dispatcher_Interface $dispatcher   * @return Zend_Controller_Front   */  public function setDispatcher(Zend_Controller_Dispatcher_Interface $dispatcher)  {    $this->_dispatcher = $dispatcher;    return $this;  }  /**   * Return the dispatcher object.   *   * @return Zend_Controller_Dispatcher_Interface   */  public function getDispatcher()  {    /**     * Instantiate the default dispatcher if one was not set.     */    if (!$this->_dispatcher instanceof Zend_Controller_Dispatcher_Interface) {      require_once 'Zend/Controller/Dispatcher/Standard.php';      $this->_dispatcher = new Zend_Controller_Dispatcher_Standard();    }    return $this->_dispatcher;  }  public function setResponse($response)  {..................    return $this;  }  public function getResponse()  {    return $this->_response;  }  public function setParam($name, $value)  {    $name = (string) $name;    $this->_invokeParams[$name] = $value;    return $this;  }  public function setParams(array $params)  {    $this->_invokeParams = array_merge($this->_invokeParams, $params);    return $this;  }  public function getParam($name)  {    if(isset($this->_invokeParams[$name])) {      return $this->_invokeParams[$name];    }    return null;  }  public function getParams()  {    return $this->_invokeParams;  }  public function clearParams($name = null)  {    if (null === $name) {      $this->_invokeParams = array();    } elseif (is_string($name) && isset($this->_invokeParams[$name])) {      unset($this->_invokeParams[$name]);    } elseif (is_array($name)) {      foreach ($name as $key) {        if (is_string($key) && isset($this->_invokeParams[$key])) {          unset($this->_invokeParams[$key]);        }      }    }    return $this;  }  public function registerPlugin(Zend_Controller_Plugin_Abstract $plugin, $stackIndex = null)  {    $this->_plugins->registerPlugin($plugin, $stackIndex);    return $this;  }  public function unregisterPlugin($plugin)  {    $this->_plugins->unregisterPlugin($plugin);    return $this;  }  public function hasPlugin($class)  {    return $this->_plugins->hasPlugin($class);  }  public function getPlugin($class)  {    return $this->_plugins->getPlugin($class);  }  public function getPlugins()  {    return $this->_plugins->getPlugins();  }  public function throwExceptions($flag = null)  {    .....................    return $this->_throwExceptions;  }  public function returnResponse($flag = null)  {    ................    return $this->_returnResponse;  }  /**   * Dispatch an HTTP request to a controller/action.   *   * @param Zend_Controller_Request_Abstract|null $request   * @param Zend_Controller_Response_Abstract|null $response   * @return void|Zend_Controller_Response_Abstract Returns response object if returnResponse() is true   */  public function dispatch(Zend_Controller_Request_Abstract $request = null, Zend_Controller_Response_Abstract $response = null)  {    if (!$this->getParam('noErrorHandler') && !$this->_plugins->hasPlugin('Zend_Controller_Plugin_ErrorHandler')) {      // Register with stack index of 100      require_once 'Zend/Controller/Plugin/ErrorHandler.php';      $this->_plugins->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(), 100);    }    if (!$this->getParam('noViewRenderer') && !Zend_Controller_Action_HelperBroker::hasHelper('viewRenderer')) {      require_once 'Zend/Controller/Action/Helper/ViewRenderer.php';      Zend_Controller_Action_HelperBroker::getStack()->offsetSet(-80, new Zend_Controller_Action_Helper_ViewRenderer());    }    /**     * Instantiate default request object (HTTP version) if none provided     */    if (null !== $request) {      $this->setRequest($request);    } elseif ((null === $request) && (null === ($request = $this->getRequest()))) {      require_once 'Zend/Controller/Request/Http.php';      $request = new Zend_Controller_Request_Http();      $this->setRequest($request);    }    /**     * Set base URL of request object, if available     */    if (is_callable(array($this->_request, 'setBaseUrl'))) {      if (null !== $this->_baseUrl) {        $this->_request->setBaseUrl($this->_baseUrl);      }    }    /**     * Instantiate default response object (HTTP version) if none provided     */    if (null !== $response) {      $this->setResponse($response);    } elseif ((null === $this->_response) && (null === ($this->_response = $this->getResponse()))) {      require_once 'Zend/Controller/Response/Http.php';      $response = new Zend_Controller_Response_Http();      $this->setResponse($response);    }    /**     * Register request and response objects with plugin broker     */    $this->_plugins       ->setRequest($this->_request)       ->setResponse($this->_response);    /**     * Initialize router     */    $router = $this->getRouter();    $router->setParams($this->getParams());    /**     * Initialize dispatcher     */    $dispatcher = $this->getDispatcher();    $dispatcher->setParams($this->getParams())          ->setResponse($this->_response);    // Begin dispatch    try {      /**       * Route request to controller/action, if a router is provided       */      /**      * Notify plugins of router startup      */      $this->_plugins->routeStartup($this->_request);      try {        $router->route($this->_request);      } catch (Exception $e) {        if ($this->throwExceptions()) {          throw $e;        }        $this->_response->setException($e);      }      /**      * Notify plugins of router completion      */      $this->_plugins->routeShutdown($this->_request);      /**       * Notify plugins of dispatch loop startup       */      $this->_plugins->dispatchLoopStartup($this->_request);      /**       * Attempt to dispatch the controller/action. If the $this->_request       * indicates that it needs to be dispatched, move to the next       * action in the request.       */      do {        $this->_request->setDispatched(true);        /**         * Notify plugins of dispatch startup         */        $this->_plugins->preDispatch($this->_request);        /**         * Skip requested action if preDispatch() has reset it         */        if (!$this->_request->isDispatched()) {          continue;        }        /**         * Dispatch request         */        try {          $dispatcher->dispatch($this->_request, $this->_response);        } catch (Exception $e) {          if ($this->throwExceptions()) {            throw $e;          }          $this->_response->setException($e);        }        /**         * Notify plugins of dispatch completion         */        $this->_plugins->postDispatch($this->_request);      } while (!$this->_request->isDispatched());    } catch (Exception $e) {      if ($this->throwExceptions()) {        throw $e;      }      $this->_response->setException($e);    }    /**     * Notify plugins of dispatch loop completion     */    try {      $this->_plugins->dispatchLoopShutdown();    } catch (Exception $e) {      if ($this->throwExceptions()) {        throw $e;      }      $this->_response->setException($e);    }    if ($this->returnResponse()) {      return $this->_response;    }    $this->_response->sendResponse();  }}

以上對Zend_Controller_Front和Zend_Controller_Dispatcher做了簡單的標記,通過分析代碼不難看出,基本的運行機制。

分發發生在前端控制器中的一個循環(loop)中。分發之前,前端控制器通過路由請求,找到用戶指定的模塊、控制器、動作和可選參數。然后進入分發循環,分發請求。

分發器需要大量數據完成任務——它需要知道如何格式化控制器和動作的名稱,到哪兒找到控制器類文件,模塊名是否有效,以及基于其它可用信息判定請求是否能分發的API。

每次迭代(iteration)過程開始時,在請求對象中設置一個標志指示該動作已分發。如果在動作或者前/后分發(pre/postDispatch)插件重置了該標志,分發循環將繼續下去并試圖分發新的請求。通過改變請求中的控制器或者動作并重置已分發標志,開發人員可以定制執行一個請求鏈。

控制這種分發過程的動作控制器方法是_forward();在任意的pre/postDispatch()或者動作中調用該方法,并傳入動作、控制器、模塊、以及可選的附加參數,就可以進入新的動作。

自定義分發器

Zend_Controller_Dispatcher_Interface定義了下列所有分發器需要實現的方法。

不過大多數情況下,只需要簡單地擴展抽象類Zend_Controller_Dispatcher_Abstract,其中已經定義好了上面的大部分方法。或者擴展Zend_Controller_Dispatcher_Standard類,基于標準分發器來修改功能。

需要子類化分發器的可能原因包括:期望在動作控制器中使用不同的類和方法命名模式,或者期望使用不同的分發方式,比如分發到控制器目錄下的動作文件,而不是控制器類的動作方法。



注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 九九久久视频 | 成年免费大片黄在线观看岛国 | 92看片淫黄大片一级 | 日韩视频高清 | 激情久久精品 | 男女羞羞在线观看 | 本站只有精品 | 毛片大全免费 | 黄色网页在线观看 | 久久69精品久久久久久国产越南 | 国产精品亚洲综合一区二区三区 | 一级黄色大片在线观看 | 91看片在线播放 | 国产大片全部免费看 | 欧美日韩手机在线观看 | 蜜桃欧美性大片免费视频 | 免费三级大片 | 成人午夜视频在线观看免费 | 久久久国产精品网站 | 一级免费a | 一级毛片免费一级 | jj视频在线播放 | 日本在线不卡一区二区三区 | 色七七久久影院 | 欧美三级短视频 | 久久生活片 | 国产正在播放 | 日本成人高清视频 | 麻豆传传媒久久久爱 | 久久福利小视频 | 国产一区日韩精品 | 蜜桃视频观看麻豆 | 91短视频在线免费观看 | 黄视频免费在线观看 | 美女羞羞视频在线观看 | 日韩黄色免费电影 | 毛片视频网站 | 香蕉视频1024| 自拍偷拍999| 福利在线免费 | 久久久www成人免费毛片 |