亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 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,其中已經定義好了上面的大部分方法?;蛘邤U展Zend_Controller_Dispatcher_Standard類,基于標準分發器來修改功能。

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



注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久一| 免费99精品国产自在在线| 亚洲精品国产综合久久| 91牛牛免费视频| 色老头一区二区三区在线观看| 成人网在线观看| 日韩精品视频在线观看网址| 国产精品免费一区二区三区都可以| 亚洲福利在线视频| 亚洲午夜av电影| 7777kkkk成人观看| 亚洲va久久久噜噜噜久久天堂| 久久久久久国产精品美女| 一区二区三区四区精品| 九九久久精品一区| 亚洲欧洲偷拍精品| 日韩免费精品视频| 精品高清美女精品国产区| 久久亚洲精品一区| 亚洲国内精品视频| 在线播放国产一区二区三区| 日本一区二区三区四区视频| 中日韩美女免费视频网站在线观看| 欧美孕妇毛茸茸xxxx| 色婷婷av一区二区三区久久| 亚洲精品永久免费精品| 亚洲女在线观看| 成人黄色免费片| 亚州欧美日韩中文视频| 国产一区二区三区视频在线观看| 精品福利樱桃av导航| 国产精品久久久久久久久久新婚| 成人午夜一级二级三级| 国产精品成人久久久久| 全球成人中文在线| 国模视频一区二区三区| 日韩小视频在线| 国产精品91久久| 在线成人中文字幕| 亚洲欧美日韩中文视频| 97久久伊人激情网| 欧美精品电影免费在线观看| 欧美激情免费观看| 亚洲男人天堂手机在线| 久久免费高清视频| 欧美诱惑福利视频| 1769国内精品视频在线播放| 日韩av电影国产| 91精品综合久久久久久五月天| 欧美精品videosex极品1| 成人av.网址在线网站| 91久久久久久国产精品| 欧美性xxxxx| 亚洲毛片在线观看.| 亚洲美女性生活视频| 亚洲石原莉奈一区二区在线观看| 亚洲欧美综合精品久久成人| 亚洲aⅴ男人的天堂在线观看| 久久久久久久久久国产| 国产一区二区三区久久精品| 国产成人精品在线视频| 欧美美最猛性xxxxxx| 国产精品久久久av久久久| 91精品国产91久久久久久| 亚洲男女性事视频| 琪琪第一精品导航| 亚洲精品一区二区三区婷婷月| 亚洲人精选亚洲人成在线| 成人久久久久久久| 91色在线视频| 91av在线免费观看| 91av在线免费观看视频| 亚洲国产精品系列| 日韩av色在线| 国产精品免费一区豆花| 欧美日韩一区二区在线| 久久久精品久久久| 欧美第一淫aaasss性| 精品国产一区二区三区久久| 欧美伦理91i| 国产做受高潮69| 精品调教chinesegay| 在线观看视频99| 成人免费观看49www在线观看| 欧美专区国产专区| 欧美视频在线观看免费| 久久福利网址导航| 美日韩精品免费观看视频| 岛国av在线不卡| 国产亚洲视频在线观看| 亚洲激情小视频| 国产精品久久久久久久app| 欧美肥臀大乳一区二区免费视频| 日本精品中文字幕| 欧美影院在线播放| 亚洲视频一区二区三区| 国产精品久久久久久久久| 91精品国产91久久久| 久久影视电视剧免费网站| 欧美午夜片在线免费观看| 91亚洲va在线va天堂va国| 亚洲第一福利视频| 精品亚洲aⅴ在线观看| 在线午夜精品自拍| 在线观看久久久久久| 国产va免费精品高清在线| 5278欧美一区二区三区| 日韩精品久久久久| 中文字幕不卡av| 一区二区三区视频在线| 91精品视频观看| 一个人看的www久久| 欧美大片免费观看在线观看网站推荐| 在线播放日韩专区| 国产日产欧美a一级在线| 久久精品成人动漫| 欧美日韩一区二区三区在线免费观看| 国产精品第三页| 美女精品视频一区| 中文字幕国产精品| 欧美视频国产精品| 91久久夜色精品国产网站| 国产精品美女www| 深夜福利91大全| 欧美贵妇videos办公室| 国产精品视频一区二区高潮| 懂色av中文一区二区三区天美| 国产精品视频最多的网站| **欧美日韩vr在线| 国产一区香蕉久久| 国产亚洲精品美女久久久久| 海角国产乱辈乱精品视频| 精品国产福利视频| 91色琪琪电影亚洲精品久久| 国产美女久久精品香蕉69| 国产99视频在线观看| 91性高湖久久久久久久久_久久99| 隔壁老王国产在线精品| 国产在线观看一区二区三区| 中文字幕日韩精品有码视频| 国产偷亚洲偷欧美偷精品| 久久精品国产69国产精品亚洲| 亚洲天堂男人天堂| 日韩av不卡电影| 午夜精品美女自拍福到在线| 欧美乱大交做爰xxxⅹ性3| 亚洲精品短视频| 久久久久这里只有精品| 亚洲色图美腿丝袜| 久久免费视频在线| 77777亚洲午夜久久多人| 国产精品一区二区久久精品| 美女少妇精品视频| 综合激情国产一区| 亚洲欧洲自拍偷拍| 理论片在线不卡免费观看| 欧美精品在线免费观看| 在线观看久久久久久| 国产精品亚洲аv天堂网| 一区二区三区国产视频| 欧洲成人午夜免费大片| 亚洲午夜精品久久久久久久久久久久| 红桃视频成人在线观看| 亚洲成人网在线观看|