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

首頁(yè) > 開發(fā) > PHP > 正文

Zend Framework教程之分發(fā)器Zend_Controller_Dispatcher用法詳解

2024-05-04 23:43:38
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Zend Framework教程之分發(fā)器Zend_Controller_Dispatcher用法,結(jié)合實(shí)例形式詳細(xì)分析了分發(fā)器Zend_Controller_Dispatcher的結(jié)構(gòu),功能,使用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
 

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

分發(fā)器的具體實(shí)現(xiàn)

Zend Framework的分發(fā)器Zend_Controller_Dispatcher設(shè)計(jì)主要有,如下類和接口組成:

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

Zend_Controller_Dispatcher_Interface

定義了分發(fā)器提供的基本和標(biāo)準(zhǔn)功能。

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

實(shí)現(xiàn)了Zend_Controller_Dispatcher_Interface接口,提供了分發(fā)器提供的基本和標(biāo)準(zhǔn)功能的抽象父類。

<?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提供的基本的分發(fā)器,完成了分發(fā)功能。

<?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);  }}

前端控制器和分發(fā)器

<?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();  }}

以上對(duì)Zend_Controller_Front和Zend_Controller_Dispatcher做了簡(jiǎn)單的標(biāo)記,通過分析代碼不難看出,基本的運(yùn)行機(jī)制。

分發(fā)發(fā)生在前端控制器中的一個(gè)循環(huán)(loop)中。分發(fā)之前,前端控制器通過路由請(qǐng)求,找到用戶指定的模塊、控制器、動(dòng)作和可選參數(shù)。然后進(jìn)入分發(fā)循環(huán),分發(fā)請(qǐng)求。

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

每次迭代(iteration)過程開始時(shí),在請(qǐng)求對(duì)象中設(shè)置一個(gè)標(biāo)志指示該動(dòng)作已分發(fā)。如果在動(dòng)作或者前/后分發(fā)(pre/postDispatch)插件重置了該標(biāo)志,分發(fā)循環(huán)將繼續(xù)下去并試圖分發(fā)新的請(qǐng)求。通過改變請(qǐng)求中的控制器或者動(dòng)作并重置已分發(fā)標(biāo)志,開發(fā)人員可以定制執(zhí)行一個(gè)請(qǐng)求鏈。

控制這種分發(fā)過程的動(dòng)作控制器方法是_forward();在任意的pre/postDispatch()或者動(dòng)作中調(diào)用該方法,并傳入動(dòng)作、控制器、模塊、以及可選的附加參數(shù),就可以進(jìn)入新的動(dòng)作。

自定義分發(fā)器

Zend_Controller_Dispatcher_Interface定義了下列所有分發(fā)器需要實(shí)現(xiàn)的方法。

不過大多數(shù)情況下,只需要簡(jiǎn)單地?cái)U(kuò)展抽象類Zend_Controller_Dispatcher_Abstract,其中已經(jīng)定義好了上面的大部分方法?;蛘邤U(kuò)展Zend_Controller_Dispatcher_Standard類,基于標(biāo)準(zhǔn)分發(fā)器來修改功能。

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



注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到PHP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
成人永久在线| 亚洲午夜精品| 性猛交富婆╳xxx乱大交一| 不卡av电影院| 欧美精品一区二区三区涩爱蜜| √最新版天堂资源网在线| 国产高潮在线| 成人在线电影网站| 国产一区二区三区av在线| 性少妇bbw张开| 日韩和欧美的一区二区| 99视频国产精品免费观看a| 免费精品视频最新在线| 亚洲淫性视频| 亚洲四区在线观看| 欧美黑人猛交| 丁香色欲久久久久久综合网| 蜜桃传媒视频麻豆第一区免费观看| 最新国产成人av网站网址麻豆| 日本电影久久久| 日韩中文影院| 成人免费电影网址| 免费人成年激情视频在线观看| 亚洲欧美另类人妖| 黄色亚洲大片免费在线观看| 香蕉视频国产精品| 中文字幕欧美日韩| 亚洲欧美精品在线| 香港三级日本三级a视频| 国产无套内射又大又猛又粗又爽| 久久av最新网址| 在线电影福利片| 污污视频在线| 91成人天堂久久成人| 亚洲视频国产精品| 伊人亚洲福利一区二区三区| 国产高清一区视频| 缅甸午夜性猛交xxxx| 国产一区二区三区免费| 看黄网站在线| www色aa色aawww| 精品人妻一区二区三区三区四区| 年轻的保姆91精品| 久久精品男人天堂av| 色婷婷亚洲婷婷| 亚洲精选91| 男人天堂综合| 久久久久国产精品夜夜夜夜夜| 中文在线手机av| 久久久久99精品成人片三人毛片| 久久久免费视频网站| 亚洲人成伊人成综合网久久久| 17videosex性欧美| 国产三级欧美三级日产三级99| 成人性生交大片免费看视频在线| 精品国产一区二区三区四区在线观看| 成人免费视频a| 国产极品久久久久久久久波多结野| 亚洲影院色无极综合| 91制片厂在线| 日韩欧美天堂| 好吊妞视频一区二区三区| 欧美亚洲一区二区三区四区| 9191国产视频| 成人高清视频免费观看| 97成人在线| 精品久久久无码中文字幕| av美女在线| 日韩人体视频| 四虎国产精品免费久久5151| 国产亚洲欧美日韩精品一区二区三区| 午夜视频在线观看一区二区三区| 朝桐光av在线一区二区三区| 国产精品久久久久9999| 337p粉嫩大胆色噜噜噜噜亚洲| 在线观看亚洲一区二区| 欧美18hd| 91cn在线观看| 庆余年2免费日韩剧观看大牛| 国产精品素人一区二区| 国产区二精品视| 亚洲AV无码成人精品区东京热| 91久久国产综合久久91猫猫| 日韩美女国产精品| 日韩伦理片在线观看| 国产精品久久久久久久久久久久| 男女爱爱网站| 日韩在线播放中文字幕| 91精品视频在线看| 偷拍自拍亚洲色图| 精东粉嫩av免费一区二区三区| 欧美性受xxxx黑人xyx性爽| 日韩电影免费观看高清完整版| 亚洲一区二区视频| 国产无码精品在线观看| 欧美激情视频网站| 欧美极品欧美精品欧美视频| 国产欧美一区二区精品仙草咪| 中日韩高清电影网| www国产精品内射老熟女| 91高潮精品免费porn| 黄色片免费在线观看视频| 91人妻一区二区| 欧美不卡在线| 日韩视频精品在线| 秘密基地免费观看完整版中文| 日本一极黄色片| 国产+成+人+亚洲欧洲| 国产精品毛片一区视频播| 久久狠狠高潮亚洲精品| 91精品国产欧美日韩| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲高清视频中文字幕| 美女又爽又黄免费视频| 欧美日韩国产亚洲沙发| 亚洲一区 二区 三区| 亚州视频一区二区三区| 欧洲成人一区二区三区| 伊人国产精品视频| 国产精品18久久久久久麻辣| 天堂av2024| 亚洲经典三级| 国产精品123区| 国产熟女高潮视频| 一区二区 亚洲| 久久国产成人精品国产成人亚洲| 日韩在线观看免费全集电视剧网站| 国产在视频一区二区三区吞精| 内射国产内射夫妻免费频道| 男女激烈动态图| 成人在线视频一区| 久久91av| 色的视频在线免费看| 欧美日本一区二区视频在线观看| 婷婷亚洲久悠悠色悠在线播放| 日韩高清成人在线| 91麻豆免费在线观看| av色资源站| 日韩精品视频在线免费观看| 久久精品亚洲精品| 91日本韩国| 91久久精品www人人做人人爽| 欧美调教视频| 黑人巨大40厘米重口ysn| 91麻豆国产自产在线观看亚洲| 亚洲精品自产拍| 国产一二区在线| 欧美日韩亚洲综合一区二区三区| 久久综合色鬼综合色| 午夜在线不卡| 久艹在线播放| 成年人二级毛片| 欧美日韩国产一区精品一区| 国产亚洲美女久久| 亚洲av综合一区| 欧美色欧美亚洲另类二区| 二区三区在线| 人妖欧美一区二区| 中文字幕一区二区中文字幕| 鲁鲁狠狠狠7777一区二区| 欧美日本成人| 天堂在线中文网官网| 99免费在线观看视频| 久久久免费看片| 夜夜躁日日躁狠狠久久88av| 亚洲免费视频中文字幕| 国产成人极品视频| 亚洲免费福利视频| 国产精品自在线| 精品在线免费观看视频| 在线免费高清一区二区三区| 久香视频在线观看| 啦啦啦在线视频免费观看高清中文| 性欧美18+| 日韩av在线一区二区| 国产女人高潮时对白| 成人国产精品色哟哟| 久久久pmvav| 欧美日韩免费一区二区三区| 亚洲欧美日韩第一页| 欧美高清不卡| 日韩美女国产精品| 最近免费中文字幕中文高清百度| gv天堂gv无码男同在线观看| 春意影院免费入口| 久久亚洲精品中文字幕冲田杏梨| 99re这里都是精品| 蜜桃av网站| 亚州精品天堂中文字幕| 全部孕妇毛片免费孕妇| 精品一区二区三区免费播放| 扒开腿狂躁女人爽出白浆2| 国产精品a久久久久| 成人3d漫画免费无遮挡软件| 有码在线播放| 久久综合国产精品台湾中文娱乐网| 亚洲成av人片一区二区三区| 在线播放精品一区二区三区| 国产麻豆一区二区三区精品视频| 高清性色生活片在线观看| ady日本映画久久精品一区二区| 黄色一区二区视频| 黄色欧美视频| 精品国产乱码久久久久久免费| xxxx影院| 国模精品系列视频| 久草在线视频网站| 精品福利一二区| 国产精品免费丝袜| 日韩伦理一区二区三区av在线| 亚洲女人av| 久久人人爽人人爽人人片av高清| 91精品国产91久久久久游泳池| 日韩一区二区电影网| 色先锋资源久久综合5566| 国产不卡一区二区三区在线观看| 色哟哟免费视频| 免费看成人午夜电影| 37pao成人国产永久免费视频| 不卡视频一区二区| 精品不卡在线视频| 在线女人免费视频| 亚洲第一会所| 999日本视频| 日韩黄色网址| 日韩午夜免费视频| 九色porny自拍| 日本少妇一区二区三区| 精品不卡一区二区三区| 日韩欧美在线一区二区三区| 嫩草视频在线观看| 久久av免费看| 国产一区二区欧美日韩| 香蕉久久网站| 大地资源第二页在线观看高清版| 亚洲在线视频福利| 性国裸体高清亚洲| 一级片免费网站| 日韩欧美久久一区| 欧美福利视频导航| 亚洲二区视频| 亚洲经典一区| 亚洲欧美一区二区三区在线| 国产高清一区二区三区视频| 欧美福利在线| 国产自产高清不卡| 秋霞精品一区二区三区| 国产一区二区欧美| 最新理论片影院| 国产福利精品视频| 国产高潮失禁喷水爽到抽搐| 欧美日韩一区二区综合| 亚洲区一区二区| 精品国产乱码久久久久久1区二区| 人妻 丝袜美腿 中文字幕| 国产三级自拍视频| 成人美女在线观看| 欧美一级精品在线| 中文字幕在线欧美| 超碰97国产精品人人cao| 亚洲老头老太hd| 色视频在线观看| 四虎精品成人免费网站| 美女毛片一区二区三区四区最新中文字幕亚洲| 最新二区三区av| 日本中文字幕高清视频| 中文字幕大看焦在线看| 777精品伊人久久久久大香线蕉| 依依成人在线视频| 美乳美女在线观看香蕉| 国产日韩欧美在线播放不卡| 天天靠夜夜靠| 亚洲精品久久久久久久久久久久| 精品无人区乱码1区2区3区免费| 91精品欧美久久久久久动漫| 国产网红女主播精品视频| 亚洲黄色免费视频| 日本不卡免费在线视频| 一区二区日韩免费看| 中文字幕亚洲综合久久筱田步美| 最近免费中文字幕mv视频| 欧美gay视频| 69国产精品成人在线播放| 日本久久久精品视频| 亚洲成人套图| 欧美性xxxxxbbbbbb精品| 热三久草你在线| 国产黄a三级三级三级av在线看| 久久人人爽人人爽人人片| 特黄特色大片免费视频大全| 久久se精品一区二区| 成人黄色片网站| 欧美日韩精品中文字幕一区二区| xvideos国产精品| 先锋亚洲精品| 欧美精品一二三四区| 美女av在线免费看| 一级片黄色免费| 蜜桃色永久入口| 欧美午夜精品在线| 亚洲欧美韩国综合色| 非洲一级黄色片| 国产一区二区免费在线观看| 国色天香一二三期区别大象| 日韩三级视频中文字幕| 久久婷婷国产91天堂综合精品| 久久精品一区二区免费播放| 今天的高清视频免费播放成人| 最新二区三区av| 欧美一二三区在线观看| 日韩欧美国产电影| 99re热视频这里只精品| 北岛玲精品视频在线观看| 国内久久精品视频| 亚洲男人天堂视频| 2023av在线| 欧美v亚洲v综合ⅴ国产v| 欧美性受极品xxxx喷水| 国产又爽又黄又舒服又刺激视频| 亚洲视频碰碰| 美女av电影| 狠狠爱免费视频| 岛国一区二区三区| 免费高清在线观看电视| 亚洲精品一区二区三区精华液| 又色又爽的视频| 最近2019好看的中文字幕免费| 亚洲美女av黄|