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

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

Zend Framework教程之路由功能Zend_Controller_Router詳解

2024-05-04 23:43:41
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了Zend Framework教程之路由功能Zend_Controller_Router,詳細(xì)分析了路由功能Zend_Controller_Router的原理,使用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
 

本文實(shí)例講述了Zend Framework教程之路由功能Zend_Controller_Router用法。分享給大家供大家參考,具體如下:

Zend Framework的路由提供了兩個(gè)主要功能路由和創(chuàng)建路由。

Zend_Controller_Router的Route類和相應(yīng)Route目錄下的類定義常見(jiàn)的路由操作

接口Zend_Controller_Router_Interface,類Zend_Controller_Router_Abstract和Zend_Controller_Router_Rewrite完成了基本的路由,創(chuàng)建路由,刪除路由的功能。

└── Router
    ├── Abstract.php
    ├── Exception.php
    ├── Interface.php
    ├── Rewrite.php
    ├── Route
    │   ├── Abstract.php
    │   ├── Chain.php
    │   ├── Hostname.php
    │   ├── Interface.php
    │   ├── Module.php
    │   ├── Regex.php
    │   └── Static.php
    └── Route.php

Zend_Controller_Router路由功能的實(shí)現(xiàn)

Zend_Controller_Router_Interface

<?phpinterface Zend_Controller_Router_Interface{  /**   * Processes a request and sets its controller and action. If   * no route was possible, an exception is thrown.   *   * @param Zend_Controller_Request_Abstract   * @throws Zend_Controller_Router_Exception   * @return Zend_Controller_Request_Abstract|boolean   */  public function route(Zend_Controller_Request_Abstract $dispatcher);  /**   * Generates a URL path that can be used in URL creation, redirection, etc.   *   * May be passed user params to override ones from URI, Request or even defaults.   * If passed parameter has a value of null, it's URL variable will be reset to   * default.   *   * If null is passed as a route name assemble will use the current Route or 'default'   * if current is not yet set.   *   * Reset is used to signal that all parameters should be reset to it's defaults.   * Ignoring all URL specified values. User specified params still get precedence.   *   * Encode tells to url encode resulting path parts.   *   * @param array $userParams Options passed by a user used to override parameters   * @param mixed $name The name of a Route to use   * @param bool $reset Whether to reset to the route defaults ignoring URL params   * @param bool $encode Tells to encode URL parts on output   * @throws Zend_Controller_Router_Exception   * @return string Resulting URL path   */  public function assemble($userParams, $name = null, $reset = false, $encode = true);  /**   * Retrieve Front Controller   *   * @return Zend_Controller_Front   */  public function getFrontController();  /**   * Set Front Controller   *   * @param Zend_Controller_Front $controller   * @return Zend_Controller_Router_Interface   */  public function setFrontController(Zend_Controller_Front $controller);  /**   * Add or modify a parameter with which to instantiate any helper objects   *   * @param string $name   * @param mixed $param   * @return Zend_Controller_Router_Interface   */  public function setParam($name, $value);  /**   * Set an array of a parameters to pass to helper object constructors   *   * @param array $params   * @return Zend_Controller_Router_Interface   */  public function setParams(array $params);  /**   * Retrieve a single parameter from the controller parameter stack   *   * @param string $name   * @return mixed   */  public function getParam($name);  /**   * Retrieve the parameters to pass to helper object constructors   *   * @return array   */  public function getParams();  /**   * Clear the controller parameter stack   *   * By default, clears all parameters. If a parameter name is given, clears   * only that parameter; if an array of parameter names is provided, clears   * each.   *   * @param null|string|array single key or array of keys for params to clear   * @return Zend_Controller_Router_Interface   */  public function clearParams($name = null);}

Zend_Controller_Router_Abstract

<?php/** Zend_Controller_Router_Interface */require_once 'Zend/Controller/Router/Interface.php';abstract class Zend_Controller_Router_Abstract implements Zend_Controller_Router_Interface{  /**   * URI delimiter   */  const URI_DELIMITER = '/';  /**   * Front controller instance   * @var Zend_Controller_Front   */  protected $_frontController;  /**   * Array of invocation parameters to use when instantiating action   * controllers   * @var array   */  protected $_invokeParams = array();  /**   * Constructor   *   * @param array $params   * @return void   */  public function __construct(array $params = array())  {    $this->setParams($params);  }  /**   * Add or modify a parameter to use when instantiating an action controller   *   * @param string $name   * @param mixed $value   * @return Zend_Controller_Router   */  public function setParam($name, $value)  {    $name = (string) $name;    $this->_invokeParams[$name] = $value;    return $this;  }  /**   * Set parameters to pass to action controller constructors   *   * @param array $params   * @return Zend_Controller_Router   */  public function setParams(array $params)  {    $this->_invokeParams = array_merge($this->_invokeParams, $params);    return $this;  }  /**   * Retrieve a single parameter from the controller parameter stack   *   * @param string $name   * @return mixed   */  public function getParam($name)  {    if(isset($this->_invokeParams[$name])) {      return $this->_invokeParams[$name];    }    return null;  }  /**   * Retrieve action controller instantiation parameters   *   * @return array   */  public function getParams()  {    return $this->_invokeParams;  }  /**   * Clear the controller parameter stack   *   * By default, clears all parameters. If a parameter name is given, clears   * only that parameter; if an array of parameter names is provided, clears   * each.   *   * @param null|string|array single key or array of keys for params to clear   * @return Zend_Controller_Router   */  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;  }  /**   * Retrieve Front Controller   *   * @return Zend_Controller_Front   */  public function getFrontController()  {    // Used cache version if found    if (null !== $this->_frontController) {      return $this->_frontController;    }    require_once 'Zend/Controller/Front.php';    $this->_frontController = Zend_Controller_Front::getInstance();    return $this->_frontController;  }  /**   * Set Front Controller   *   * @param Zend_Controller_Front $controller   * @return Zend_Controller_Router_Interface   */  public function setFrontController(Zend_Controller_Front $controller)  {    $this->_frontController = $controller;    return $this;  }}

Zend_Controller_Router_Rewrite

<?php/** Zend_Controller_Router_Abstract */require_once 'Zend/Controller/Router/Abstract.php';/** Zend_Controller_Router_Route */require_once 'Zend/Controller/Router/Route.php';class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract{  /**   * Whether or not to use default routes   *   * @var boolean   */  protected $_useDefaultRoutes = true;  /**   * Array of routes to match against   *   * @var array   */  protected $_routes = array();  /**   * Currently matched route   *   * @var Zend_Controller_Router_Route_Interface   */  protected $_currentRoute = null;  /**   * Global parameters given to all routes   *   * @var array   */  protected $_globalParams = array();  /**   * Separator to use with chain names   *   * @var string   */  protected $_chainNameSeparator = '-';  /**   * Determines if request parameters should be used as global parameters   * inside this router.   *   * @var boolean   */  protected $_useCurrentParamsAsGlobal = false;  /**   * Add default routes which are used to mimic basic router behaviour   *   * @return Zend_Controller_Router_Rewrite   */  public function addDefaultRoutes()  {    if (!$this->hasRoute('default')) {      $dispatcher = $this->getFrontController()->getDispatcher();      $request = $this->getFrontController()->getRequest();      require_once 'Zend/Controller/Router/Route/Module.php';      $compat = new Zend_Controller_Router_Route_Module(array(), $dispatcher, $request);      $this->_routes = array('default' => $compat) + $this->_routes;    }    return $this;  }  /**   * Add route to the route chain   *   * If route contains method setRequest(), it is initialized with a request object   *   * @param string                 $name    Name of the route   * @param Zend_Controller_Router_Route_Interface $route   Instance of the route   * @return Zend_Controller_Router_Rewrite   */  public function addRoute($name, Zend_Controller_Router_Route_Interface $route)  {    if (method_exists($route, 'setRequest')) {      $route->setRequest($this->getFrontController()->getRequest());    }    $this->_routes[$name] = $route;    return $this;  }  /**   * Add routes to the route chain   *   * @param array $routes Array of routes with names as keys and routes as values   * @return Zend_Controller_Router_Rewrite   */  public function addRoutes($routes) {    foreach ($routes as $name => $route) {      $this->addRoute($name, $route);    }    return $this;  }  /**   * Create routes out of Zend_Config configuration   *   * Example INI:   * routes.archive.route = "archive/:year/*"   * routes.archive.defaults.controller = archive   * routes.archive.defaults.action = show   * routes.archive.defaults.year = 2000   * routes.archive.reqs.year = "/d+"   *   * routes.news.type = "Zend_Controller_Router_Route_Static"   * routes.news.route = "news"   * routes.news.defaults.controller = "news"   * routes.news.defaults.action = "list"   *   * And finally after you have created a Zend_Config with above ini:   * $router = new Zend_Controller_Router_Rewrite();   * $router->addConfig($config, 'routes');   *   * @param Zend_Config $config Configuration object   * @param string   $section Name of the config section containing route's definitions   * @throws Zend_Controller_Router_Exception   * @return Zend_Controller_Router_Rewrite   */  public function addConfig(Zend_Config $config, $section = null)  {    if ($section !== null) {      if ($config->{$section} === null) {        require_once 'Zend/Controller/Router/Exception.php';        throw new Zend_Controller_Router_Exception("No route configuration in section '{$section}'");      }      $config = $config->{$section};    }    foreach ($config as $name => $info) {      $route = $this->_getRouteFromConfig($info);      if ($route instanceof Zend_Controller_Router_Route_Chain) {        if (!isset($info->chain)) {          require_once 'Zend/Controller/Router/Exception.php';          throw new Zend_Controller_Router_Exception("No chain defined");        }        if ($info->chain instanceof Zend_Config) {          $childRouteNames = $info->chain;        } else {          $childRouteNames = explode(',', $info->chain);        }        foreach ($childRouteNames as $childRouteName) {          $childRoute = $this->getRoute(trim($childRouteName));          $route->chain($childRoute);        }        $this->addRoute($name, $route);      } elseif (isset($info->chains) && $info->chains instanceof Zend_Config) {        $this->_addChainRoutesFromConfig($name, $route, $info->chains);      } else {        $this->addRoute($name, $route);      }    }    return $this;  }  /**   * Get a route frm a config instance   *   * @param Zend_Config $info   * @return Zend_Controller_Router_Route_Interface   */  protected function _getRouteFromConfig(Zend_Config $info)  {    $class = (isset($info->type)) ? $info->type : 'Zend_Controller_Router_Route';    if (!class_exists($class)) {      require_once 'Zend/Loader.php';      Zend_Loader::loadClass($class);    }    $route = call_user_func(array($class, 'getInstance'), $info);    if (isset($info->abstract) && $info->abstract && method_exists($route, 'isAbstract')) {      $route->isAbstract(true);    }    return $route;  }  /**   * Add chain routes from a config route   *   * @param string                 $name   * @param Zend_Controller_Router_Route_Interface $route   * @param Zend_Config              $childRoutesInfo   * @return void   */  protected function _addChainRoutesFromConfig($name,                         Zend_Controller_Router_Route_Interface $route,                         Zend_Config $childRoutesInfo)  {    foreach ($childRoutesInfo as $childRouteName => $childRouteInfo) {      if (is_string($childRouteInfo)) {        $childRouteName = $childRouteInfo;        $childRoute   = $this->getRoute($childRouteName);      } else {        $childRoute = $this->_getRouteFromConfig($childRouteInfo);      }      if ($route instanceof Zend_Controller_Router_Route_Chain) {        $chainRoute = clone $route;        $chainRoute->chain($childRoute);      } else {        $chainRoute = $route->chain($childRoute);      }      $chainName = $name . $this->_chainNameSeparator . $childRouteName;      if (isset($childRouteInfo->chains)) {        $this->_addChainRoutesFromConfig($chainName, $chainRoute, $childRouteInfo->chains);      } else {        $this->addRoute($chainName, $chainRoute);      }    }  }  /**   * Remove a route from the route chain   *   * @param string $name Name of the route   * @throws Zend_Controller_Router_Exception   * @return Zend_Controller_Router_Rewrite   */  public function removeRoute($name)  {    if (!isset($this->_routes[$name])) {      require_once 'Zend/Controller/Router/Exception.php';      throw new Zend_Controller_Router_Exception("Route $name is not defined");    }    unset($this->_routes[$name]);    return $this;  }  /**   * Remove all standard default routes   *   * @param Zend_Controller_Router_Route_Interface Route   * @return Zend_Controller_Router_Rewrite   */  public function removeDefaultRoutes()  {    $this->_useDefaultRoutes = false;    return $this;  }  /**   * Check if named route exists   *   * @param string $name Name of the route   * @return boolean   */  public function hasRoute($name)  {    return isset($this->_routes[$name]);  }  /**   * Retrieve a named route   *   * @param string $name Name of the route   * @throws Zend_Controller_Router_Exception   * @return Zend_Controller_Router_Route_Interface Route object   */  public function getRoute($name)  {    if (!isset($this->_routes[$name])) {      require_once 'Zend/Controller/Router/Exception.php';      throw new Zend_Controller_Router_Exception("Route $name is not defined");    }    return $this->_routes[$name];  }  /**   * Retrieve a currently matched route   *   * @throws Zend_Controller_Router_Exception   * @return Zend_Controller_Router_Route_Interface Route object   */  public function getCurrentRoute()  {    if (!isset($this->_currentRoute)) {      require_once 'Zend/Controller/Router/Exception.php';      throw new Zend_Controller_Router_Exception("Current route is not defined");    }    return $this->getRoute($this->_currentRoute);  }  /**   * Retrieve a name of currently matched route   *   * @throws Zend_Controller_Router_Exception   * @return Zend_Controller_Router_Route_Interface Route object   */  public function getCurrentRouteName()  {    if (!isset($this->_currentRoute)) {      require_once 'Zend/Controller/Router/Exception.php';      throw new Zend_Controller_Router_Exception("Current route is not defined");    }    return $this->_currentRoute;  }  /**   * Retrieve an array of routes added to the route chain   *   * @return array All of the defined routes   */  public function getRoutes()  {    return $this->_routes;  }  /**   * Find a matching route to the current PATH_INFO and inject   * returning values to the Request object.   *   * @throws Zend_Controller_Router_Exception   * @return Zend_Controller_Request_Abstract Request object   */  public function route(Zend_Controller_Request_Abstract $request)  {    if (!$request instanceof Zend_Controller_Request_Http) {      require_once 'Zend/Controller/Router/Exception.php';      throw new Zend_Controller_Router_Exception('Zend_Controller_Router_Rewrite requires a Zend_Controller_Request_Http-based request object');    }    if ($this->_useDefaultRoutes) {      $this->addDefaultRoutes();    }    // Find the matching route    $routeMatched = false;    foreach (array_reverse($this->_routes, true) as $name => $route) {      // TODO: Should be an interface method. Hack for 1.0 BC      if (method_exists($route, 'isAbstract') && $route->isAbstract()) {        continue;      }      // TODO: Should be an interface method. Hack for 1.0 BC      if (!method_exists($route, 'getVersion') || $route->getVersion() == 1) {        $match = $request->getPathInfo();      } else {        $match = $request;      }      if ($params = $route->match($match)) {        $this->_setRequestParams($request, $params);        $this->_currentRoute = $name;        $routeMatched    = true;        break;      }    }     if (!$routeMatched) {       require_once 'Zend/Controller/Router/Exception.php';       throw new Zend_Controller_Router_Exception('No route matched the request', 404);     }    if($this->_useCurrentParamsAsGlobal) {      $params = $request->getParams();      foreach($params as $param => $value) {        $this->setGlobalParam($param, $value);      }    }    return $request;  }  protected function _setRequestParams($request, $params)  {    foreach ($params as $param => $value) {      $request->setParam($param, $value);      if ($param === $request->getModuleKey()) {        $request->setModuleName($value);      }      if ($param === $request->getControllerKey()) {        $request->setControllerName($value);      }      if ($param === $request->getActionKey()) {        $request->setActionName($value);      }    }  }  /**   * Generates a URL path that can be used in URL creation, redirection, etc.   *   * @param array $userParams Options passed by a user used to override parameters   * @param mixed $name The name of a Route to use   * @param bool $reset Whether to reset to the route defaults ignoring URL params   * @param bool $encode Tells to encode URL parts on output   * @throws Zend_Controller_Router_Exception   * @return string Resulting absolute URL path   */  public function assemble($userParams, $name = null, $reset = false, $encode = true)  {    if (!is_array($userParams)) {      require_once 'Zend/Controller/Router/Exception.php';      throw new Zend_Controller_Router_Exception('userParams must be an array');    }    if ($name == null) {      try {        $name = $this->getCurrentRouteName();      } catch (Zend_Controller_Router_Exception $e) {        $name = 'default';      }    }    // Use UNION (+) in order to preserve numeric keys    $params = $userParams + $this->_globalParams;    $route = $this->getRoute($name);    $url  = $route->assemble($params, $reset, $encode);    if (!preg_match('|^[a-z]+://|', $url)) {      $url = rtrim($this->getFrontController()->getBaseUrl(), self::URI_DELIMITER) . self::URI_DELIMITER . $url;    }    return $url;  }  /**   * Set a global parameter   *   * @param string $name   * @param mixed $value   * @return Zend_Controller_Router_Rewrite   */  public function setGlobalParam($name, $value)  {    $this->_globalParams[$name] = $value;    return $this;  }  /**   * Set the separator to use with chain names   *   * @param string $separator The separator to use   * @return Zend_Controller_Router_Rewrite   */  public function setChainNameSeparator($separator) {    $this->_chainNameSeparator = $separator;    return $this;  }  /**   * Get the separator to use for chain names   *   * @return string   */  public function getChainNameSeparator() {    return $this->_chainNameSeparator;  }  /**   * Determines/returns whether to use the request parameters as global parameters.   *   * @param boolean|null $use   *      Null/unset when you want to retrieve the current state.   *      True when request parameters should be global, false otherwise   * @return boolean|Zend_Controller_Router_Rewrite   *       Returns a boolean if first param isn't set, returns an   *       instance of Zend_Controller_Router_Rewrite otherwise.   *   */  public function useRequestParametersAsGlobal($use = null) {    if($use === null) {      return $this->_useCurrentParamsAsGlobal;    }    $this->_useCurrentParamsAsGlobal = (bool) $use;    return $this;  }}

添加路由的操作方法

public function addRoute($name, Zend_Controller_Router_Route_Interface $route)
public function addRoutes($routes)

$router = $ctrl->getRouter(); // returns a rewrite router by default$router->addRoute('user',         new Zend_Controller_Router_Route('user/:username'));

addRoute的第一個(gè)參數(shù)是路由名。第二個(gè)參數(shù)是路由自己。路由名最普通的用法是通過(guò)Zend_View_Url助手的方法:

"<?= $this->url(array('username' => 'martel'), 'user') ?>">Martel</a>

它將導(dǎo)致在 href: user/martel.

路由是一個(gè)簡(jiǎn)單的過(guò)程,這個(gè)過(guò)程通過(guò)所有提供的路由和匹配它的當(dāng)前請(qǐng)求的URI定義來(lái)迭代。當(dāng)一個(gè)正匹配被發(fā)現(xiàn),變量值從路由實(shí)例返回并注入到Zend_Controller_Request對(duì)象以備將來(lái)在派遣器和用戶創(chuàng)建的控制器中使用。如果是負(fù)匹配,在鏈中的下個(gè)路由被檢查。

Note: 倒序匹配

用倒序來(lái)匹配路由確保最通用的路由被首先定義。

Note: 返回的值

從路由返回的值來(lái)自于URL參數(shù)或用于定義的缺省值。這些變量以后可通過(guò)Zend_Controller_Request::getParam() 或 Zend_Controller_Action::_getParam() 方法來(lái)訪問(wèn)。

有三個(gè)特殊的變量可用于你的路由-'module'、 'controller' 和 'action'。這些特殊的變量被Zend_Controller_Dispatcher用來(lái)找出控制器和動(dòng)作然后派遣過(guò)去。

Note: 特殊變量

如果你選擇通過(guò) setControllerKey 和 setActionKey方法的方式來(lái)改變?nèi)笔≈担@些特殊變量的名字可能會(huì)不同。

缺省路由

Zend_Controller_Router_Rewrite 和缺省路由一起預(yù)先配置,它將以controller/action的形式匹配URIs。另外,模塊名可以被指定作為第一個(gè)路徑參數(shù),允許這種module/controller/action形式的URIs。最后,它也將缺省地匹配任何另外的追加到URI的參數(shù)-controller/action/var1/value1/var2/value2。

一些路由如何匹配的例子:

// Assuming the following:$ctrl->setControllerDirectory(  array(    'default' => '/path/to/default/controllers',    'news'  => '/path/to/news/controllers',    'blog'  => '/path/to/blog/controllers'  ));Module only:http://example/news  module == newsInvalid module maps to controller name:http://example/foo  controller == fooModule + controller:http://example/blog/archive  module   == blog  controller == archiveModule + controller + action:http://example/blog/archive/list  module   == blog  controller == archive  action   == listModule + controller + action + params:http://example/blog/archive/list/sort/alpha/date/desc  module   == blog  controller == archive  action   == list  sort    == alpha  date    == desc

缺省路由是存儲(chǔ)在RewriteRouter名(index)為'default'的簡(jiǎn)單的Zend_Controller_Router_Route_Module對(duì)象。它被創(chuàng)建多多少少象下面這樣:

$compat = new Zend_Controller_Router_Route_Module(array(),                         $dispatcher,                         $request);$this->addRoute('default', $compat);

如果你不想這個(gè)特別的缺省路由在你的路由計(jì)劃中,你可以重寫(xiě)你自己的‘缺省'路由(例如,把它存儲(chǔ)在'default'名下)或用removeDefaultRoutes()完全清除它:

// Remove any default routes$router->removeDefaultRoutes();

為了增加路由的靈活性,方便自定義新的路由類型,Zend_Controller_Router定義了Zend_Controller_Router_Route_Interface接口和類Zend_Controller_Router_Route_Abstract,實(shí)現(xiàn)相應(yīng)的類方法即可定義路由類型,為開(kāi)發(fā)提供了便利。

Zend_Controller_Router的路由類型

Zend_Controller_Router默認(rèn)提供了以下路由類型,分別為:

Zend_Controller_Router_Route
Zend_Controller_Router_Route_Static
Zend_Controller_Router_Route_Regex
Zend_Controller_Router_Route_Hostname
Zend_Controller_Router_Route_Module
Zend_Controller_Router_Route_Chain
Zend_Controller_Router_Route

Zend_Controller_Router_Route是標(biāo)準(zhǔn)的框架路由。它結(jié)合了靈活路由定義的易用性。每個(gè)路由包含了基本的URL映射(靜態(tài)的和動(dòng)態(tài)的部分(變量))并且可以被缺省地初始化,也可以根據(jù)不同的要求初始化。

讓我們想象一下我們假設(shè)的應(yīng)用程序?qū)⑿枰恍V域內(nèi)容作者的信息頁(yè)面。我們想能夠把瀏覽器指向http://domain.com/author/martel去看一個(gè)叫"martel"的信息。有這樣功能的路由看起來(lái)是這樣的:

$route = new Zend_Controller_Router_Route(  'author/:username',  array(    'controller' => 'profile',    'action'   => 'userinfo'  ));$router->addRoute('user', $route);

在Zend_Controller_Router_Route里構(gòu)造函數(shù)的第一個(gè)參數(shù)是路由的定義,它將匹配一個(gè)URL。路由定義包含靜態(tài)的和動(dòng)態(tài)部分,它們由正斜杠('/')符分開(kāi)。靜態(tài)部分只是簡(jiǎn)單的字符:author。動(dòng)態(tài)部分,被叫做變量,用預(yù)設(shè)的冒號(hào)來(lái)標(biāo)記變量名::username。

Note: 字符的的用法

當(dāng)前的實(shí)現(xiàn)允許你使用任何字符(正斜杠除外)作為變量標(biāo)識(shí)符,但強(qiáng)烈建議只使用PHP使用的變量標(biāo)識(shí)符。將來(lái)的實(shí)現(xiàn)也許會(huì)改變這個(gè)行為,它可能會(huì)導(dǎo)致在你的代碼里有隱藏的bugs。

當(dāng)你把瀏覽器指向http://domain.com/author/martel這個(gè)例子的路由應(yīng)該被匹配,它所有的變量將被注入到Zend_Controller_Request對(duì)象并在ProfileController可訪問(wèn)。由這個(gè)例子返回的變量可能會(huì)被表示為如下鍵和值配對(duì)的數(shù)組:

$values = array(  'username'  => 'martel',  'controller' => 'profile',  'action'   => 'userinfo');

稍后,基于這些值,Zend_Controller_Dispatcher_Standard應(yīng)該調(diào)用ProfileController類(在缺省模塊中)中的userinfoAction()方法。你將依靠Zend_Controller_Action::_getParam()或者Zend_Controller_Request::getParam()方法能夠訪問(wèn)所有的變量:

public function userinfoAction(){  $request = $this->getRequest();  $username = $request->getParam('username');  $username = $this->_getParam('username');}

路由定義可以包一個(gè)額外的特別字符-通配符-表示為'*'號(hào)。它被用來(lái)取得參數(shù),和缺省模塊路由類似(在URI中定義的var=>value)。下面的路由多多少少地模仿了模塊路由的行為:

$route = new Zend_Controller_Router_Route(  ':module/:controller/:action/*',  array('module' => 'default'));$router->addRoute('default', $route);

變量缺省

在路由中每個(gè)變量可以有一個(gè)缺省值,這就是Zend_Controller_Router_Route中構(gòu)造函數(shù)使用的第二個(gè)變量。這個(gè)參數(shù)是一個(gè)數(shù)組,在數(shù)組中鍵表示變量名,值就是期望的缺省值:

$route = new Zend_Controller_Router_Route(  'archive/:year',  array('year' => 2006));$router->addRoute('archive', $route);

上述路由將匹配象http://domain.com/archive/2005和http://example.com/archive的URLs。對(duì)于后者變量year將有一個(gè)初始的缺省值為2006。

這個(gè)例子將導(dǎo)致注入一個(gè)year變量給請(qǐng)求對(duì)象。應(yīng)為沒(méi)有路由信息出現(xiàn)(沒(méi)有控制器和動(dòng)作參數(shù)被定義),應(yīng)用程序?qū)⒈慌汕步o缺省的控制器和動(dòng)作方法(它們都在Zend_Controller_Dispatcher_Abstract被定義)。為使它更可用,你必須提供一個(gè)有效的控制器和動(dòng)作作為路由的缺省值:

$route = new Zend_Controller_Router_Route(  'archive/:year',  array(    'year'    => 2006,    'controller' => 'archive',    'action'   => 'show'  ));$router->addRoute('archive', $route);

這個(gè)路由將導(dǎo)致派遣給ArchiveController類的showAction()方法。

變量請(qǐng)求

當(dāng)變量請(qǐng)求被設(shè)定,第三個(gè)參數(shù)可以加給Zend_Controller_Router_Route的構(gòu)造函數(shù)。這些被定義為正則表達(dá)式的一部分:

$route = new Zend_Controller_Router_Route(  'archive/:year',  array(    'year'    => 2006,    'controller' => 'archive',    'action'   => 'show'  ),  array('year' => '/d+'));$router->addRoute('archive', $route);

用上述定義的路由,路由器僅當(dāng)year變量包含數(shù)字?jǐn)?shù)據(jù)將匹配它,例如http://domain.com/archive/2345。象http://example.com/archive/test這樣的URL將不被匹配并且控制將被傳遞給在鏈中的下一個(gè)路由。

主機(jī)名路由

你也可以使用主機(jī)名做路由匹配。對(duì)簡(jiǎn)單的匹配使用靜態(tài)主機(jī)名選項(xiàng):

$route = new Zend_Controller_Router_Route(  array(    'host' => 'blog.mysite.com',    'path' => 'archive'  ),  array(    'module'   => 'blog',    'controller' => 'archive',    'action'   => 'index'  ));$router->addRoute('archive', $route);

如果你想匹配參數(shù)在主機(jī)名里,使用 regex 選項(xiàng)。在下面例子中,子域?yàn)閯?dòng)作控制器被用作用戶名參數(shù)。 當(dāng)組裝路由時(shí),你可以給出用戶名為參數(shù),就像你用其它路徑參數(shù)一樣:

$route = new Zend_Controller_Router_Route(  array(    'host' => array(      'regex'  => '([a-z]+).mysite.com',      'reverse' => '%s.mysite.com'      'params' => array(        1 => 'username'      )    ),    'path' => ''  ),  array(    'module'   => 'users',    'controller' => 'profile',    'action'   => 'index'  ));$router->addRoute('profile', $route);

Zend_Controller_Router_Route_Static

設(shè)置固定不變的路由:

$route = new Zend_Controller_Router_Route_Static(  'login',  array('controller' => 'auth', 'action' => 'login'));$router->addRoute('login', $route);

上面的路由將匹配http://domain.com/login的URL,并分派到 AuthController::loginAction().

Zend_Controller_Router_Route_Regex

除了缺省的和靜態(tài)的路由類型外,正則表達(dá)式路由類型也可用。這個(gè)路由比其它路由更強(qiáng)更靈活,只是稍微有點(diǎn)復(fù)雜。同時(shí),它應(yīng)該比標(biāo)準(zhǔn)路由快。

象標(biāo)準(zhǔn)路由一樣,這個(gè)路由必須用路由定義和一些缺省條件來(lái)初始化。讓我們創(chuàng)建一個(gè)archive路由作為例子,和先前定義的類似,這次只是用了Regex:

$route = new Zend_Controller_Router_Route_Regex(  'archive/(/d+)',  array(    'controller' => 'archive',    'action'   => 'show'  ));$router->addRoute('archive', $route);

每個(gè)定義的regex子模式將被注入到請(qǐng)求對(duì)象里。同上述的例子,再成功匹配http://domain.com/archive/2006之后,結(jié)果值的數(shù)組看起來(lái)象這樣:

$values = array(  1      => '2006',  'controller' => 'archive',  'action'   => 'show');

Note: 在匹配之前,開(kāi)頭和結(jié)尾的斜杠從路由器里的URL中去除掉了。結(jié)果,匹配http://domain.com/foo/bar/,需要foo/bar這樣的regex,而不是/foo/bar。

Note: 行開(kāi)頭和行結(jié)尾符號(hào)(分別為'^' 和 '$')被自動(dòng)預(yù)先追加到所有表達(dá)式。這樣,你不需要在你的正則表達(dá)式里用它們,你應(yīng)該匹配整個(gè)字符串。

Note: 這個(gè)路由類使用#符作為分隔符。這意味著你將需要避免哈希符('#')但不是正斜杠('/')在你的路由定義里。因?yàn)?#39;#'符(名稱為錨)很少被傳給webserver,你將幾乎不需要在你的regex里使用它。

你可以用通常的辦法獲得已定義的子模式的內(nèi)容:

public function showAction(){  $request = $this->getRequest();  $year  = $request->getParam(1); // $year = '2006';}

Note: 注意這個(gè)鍵是整數(shù)(1) 而不是字符串('1')。

因?yàn)?#39;year'的缺省沒(méi)有設(shè)置,這個(gè)路由將和它的標(biāo)準(zhǔn)路由副本不是非常精確地相同。即使我們?yōu)?#39;year'聲明一個(gè)缺省并使子模式可選,也不清楚是否會(huì)在拖尾斜杠(trailing slash)上還將有問(wèn)題。方案是使整個(gè)'year'部分和斜杠一起可選但只抓取數(shù)字部分:(這段比較繞口,請(qǐng)校對(duì)者仔細(xì)看看,謝謝 Jason Qi)

$route = new Zend_Controller_Router_Route_Regex(  'archive(?:/(/d+))?',  array(    1      => '2006',    'controller' => 'archive',    'action'   => 'show'  ));$router->addRoute('archive', $route);

讓我們看看你可能注意到的問(wèn)題。 給參數(shù)使用基于整數(shù)的鍵不是容易管理的辦法,今后可能會(huì)有問(wèn)題。這就是為什么有第三個(gè)參數(shù)。這是個(gè)聯(lián)合數(shù)組表示一個(gè)regex子模式到參數(shù)名鍵的映射。我們來(lái)看看一個(gè)簡(jiǎn)單的例子:

$route = new Zend_Controller_Router_Route_Regex(  'archive/(/d+)',  array(    'controller' => 'archive',    'action' => 'show'  ),  array(    1 => 'year'  ));$router->addRoute('archive', $route);

這將導(dǎo)致下面的值被注入到請(qǐng)求:

$values = array(  'year'    => '2006',  'controller' => 'archive',  'action'   => 'show');

這個(gè)映射被任何目錄來(lái)定義使它能工作于任何環(huán)境。鍵可以包含變量名或子模式索引:

$route = new Zend_Controller_Router_Route_Regex(  'archive/(/d+)',  array( ... ),  array(1 => 'year'));// OR$route = new Zend_Controller_Router_Route_Regex(  'archive/(/d+)',  array( ... ),  array('year' => 1));

Note: 子模式鍵必須用整數(shù)表示。

注意在請(qǐng)求值中的數(shù)字索引不見(jiàn)了,代替的是一個(gè)名字變量。當(dāng)然如果你愿意可以把數(shù)字和名字變量混合使用

$route = new Zend_Controller_Router_Route_Regex(  'archive/(/d+)/page/(/d+)',  array( ... ),  array('year' => 1));

這將導(dǎo)致在請(qǐng)求中有混合的值可用。例如:URLhttp://domain.com/archive/2006/page/10將在下列結(jié)果中:

$values = array(  'year'    => '2006',  2      => 10,  'controller' => 'archive',  'action'   => 'show');

因?yàn)閞egex模型不容易顛倒,如果你想用URL助手或這個(gè)類中的 assemble方法,你需要準(zhǔn)備一個(gè)顛倒的URL。這個(gè)顛倒的路徑用可由sprintf()解析的字符串來(lái)表示并定義為第四個(gè)構(gòu)造參數(shù):

$route = new Zend_Controller_Router_Route_Regex(  'archive/(/d+)',  array( ... ),  array('year' => 1),  'archive/%s');

所有這些都已經(jīng)可能由標(biāo)準(zhǔn)路由對(duì)象完成,那么使用Regex路由的好處在哪里?首先,它允許你不受限制地描述任何類型的URL。想象一下你有一個(gè)博客并希望創(chuàng)建象http://domain.com/blog/archive/01-Using_the_Regex_Router.html這樣的URLs,還有把解析它路徑元素中的最后部分,01-Using_the_Regex_Router.html,到一個(gè)文章的ID和文章的標(biāo)題/描述;這不可能由標(biāo)準(zhǔn)路由完成。用Regex路由,你可以做象下面的方案:

$route = new Zend_Controller_Router_Route_Regex(  'blog/archive/(/d+)-(.+)/.html',  array(    'controller' => 'blog',    'action'   => 'view'  ),  array(    1 => 'id',    2 => 'description'  ),  'blog/archive/%d-%s.html');$router->addRoute('blogArchive', $route);

正如你所看到的,這個(gè)在標(biāo)準(zhǔn)路由上添加了巨大的靈活性。

通過(guò)配置文件定義路由規(guī)則

例如

[production]routes.archive.route = "archive/:year/*"routes.archive.defaults.controller = archiveroutes.archive.defaults.action = showroutes.archive.defaults.year = 2000routes.archive.reqs.year = "/d+"routes.news.type = "Zend_Controller_Router_Route_Static"routes.news.route = "news"routes.news.defaults.controller = "news"routes.news.defaults.action = "list"routes.archive.type = "Zend_Controller_Router_Route_Regex"routes.archive.route = "archive/(/d+)"routes.archive.defaults.controller = "archive"routes.archive.defaults.action = "show"routes.archive.map.1 = "year"; OR: routes.archive.map.year = 1

上述的INI文件可以被讀進(jìn)Zend_Config對(duì)象:

$config = new Zend_Config_Ini('/path/to/config.ini', 'production');$router = new Zend_Controller_Router_Rewrite();$router->addConfig($config, 'routes');

在上面的例子中,我們告訴路由器去使用INI文件'routes'一節(jié)給它的路由。每個(gè)在這個(gè)節(jié)下的頂級(jí)鍵將用來(lái)定義路由名;上述例子定義了路由'archive'和'news'。每個(gè)路由接著要求,至少,一個(gè)'route'條目和一個(gè)或更多'defaults'條目;可選地,一個(gè)或更多'reqs'('required'的簡(jiǎn)寫(xiě))可能要求提供??傊?,這些相對(duì)應(yīng)的三個(gè)參數(shù)提供給Zend_Controller_Router_Route_Interface對(duì)象。一個(gè)選項(xiàng)鍵,'type',可用來(lái)指定路由類的類型給特殊的路由;缺省地,它使用Zend_Controller_Router_Route。在上述例子中,'news'路由被定義來(lái)使用Zend_Controller_Router_Route_Static。

自定義路由類型

標(biāo)準(zhǔn)的rewrite路由器應(yīng)當(dāng)最大限度提供你所需的功能;大多時(shí)候,為了通過(guò)已知的路由提供新的或修改的功能,你將只需要?jiǎng)?chuàng)建一個(gè)新的路由類型

那就是說(shuō),你可能想要用不同的路由范例。接口Zend_Controller_Router_Interface提供了需要最少的信息來(lái)創(chuàng)建路由器,并包含一個(gè)單個(gè)的方法。

interface Zend_Controller_Router_Interface{ /**  * @param Zend_Controller_Request_Abstract $request  * @throws Zend_Controller_Router_Exception  * @return Zend_Controller_Request_Abstract  */ public function route(Zend_Controller_Request_Abstract $request);}

路由只發(fā)生一次:當(dāng)請(qǐng)求第一次接收到系統(tǒng)。路由器的意圖是基于請(qǐng)求的環(huán)境決定控制器、動(dòng)作和可選的參數(shù),并把它們發(fā)給請(qǐng)求。請(qǐng)求對(duì)象接著傳遞給派遣器。如果不可能映射一個(gè)路由到一個(gè)派遣令牌,路由器對(duì)請(qǐng)求對(duì)象就什么也不做。



注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到PHP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
四虎永久国产精品| 精品中文字幕一区二区三区| 一区二区欧美日韩| 欧美日韩一区久久| 男人天堂手机在线| 免费精品国产自产拍观看| 2020国产精品小视频| 日韩色性视频| 国产精品视频一二区| 北条麻妃av高潮尖叫在线观看| av在线官网| 亚洲国产免费| 精品一区二区三区蜜桃在线| 亚洲欧洲日产国产综合网| 日韩视频免费观看| 丰满的亚洲女人毛茸茸| 久99久在线视频| 午夜精品久久久久久久99热影院| 黄色国产精品| 天天噜噜噜噜噜噜| 91在线国产剧情| www在线免费观看视频| 91精品亚洲一区在线观看| 午夜美女福利视频| a v视频在线观看| 国产丝袜在线精品| 欧美成人精品高清在线播放| 久久久久xxxx| 在线免费日韩av| av成人动漫| 国产精品无码专区| 一本一道久久a久久| 国产欧美日韩91| 国产成人97精品免费看片| 91精品国产亚洲| 亚洲三级免费电影| 91超碰在线播放| 亚洲女人18毛片水真多| 国产麻豆精品一区| 最近免费中文字幕大全免费版视频| 中文字幕在线观看你懂的| 天天躁日日躁成人字幕aⅴ| caopen在线视频| 先锋影音久久久| 欧美大片免费看| 91xx在线观看| 91精品国产品国语在线不卡| 日日夜夜视频| 国产乱子伦精品| 乱子伦视频在线看| 丰满女人性猛交| 久久综合久久久久| 另类free性欧美护士| 黄色国产网站在线观看| 精品久久一二三| 色一情一交一乱一区二区三区| 中文在线а天堂av| 精品一区二区日韩| 99精品视频一区| 蜜臀av在线播放一区二区三区| 国产精品69毛片高清亚洲| 一个色免费成人影院| 欧美日韩精品免费观看视一区二区| 亚洲成人av一区二区| 国产一区二区精品在线| 亚洲色成人一区二区三区小说| 久久亚洲国产视频| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 久久精品无码中文字幕| 蝴蝶中文综合娱乐网| 国产aⅴ激情无码久久久无码| 国内精品久久久久久久久电影网| 国产在线成人精品午夜| 亚洲女同精品视频| 欧美日韩中文不卡| 亚洲成人福利在线观看| 欧美成人明星100排名| 久久精品视频免费观看| 5月丁香婷婷综合| 成人免费毛片xxx| www.91视频| 中文字幕91| 国产中文av在线| wwwav91| 久久亚洲精品中文字幕冲田杏梨| 欧美午夜精品理论片a级大开眼界| 亚洲国产成人va在线观看麻豆| 四虎成年永久免费网站| 在线免费看av网站| 卡通欧美亚洲| 草莓视频app18在线视频| 一个人在线视频免费观看www| 日本熟妇毛茸茸丰满| 满满都是荷尔蒙韩剧在线观看| 国产精品久久久免费| 国产精品一二三区在线观看| 久久社区一区| 成人激情av在线| 国产精品久久久视频| 精品免费国产一区二区| 国产成人av一区二区三区| av综合网址| 欧美在线视频一区二区三区| 国产高清不卡av| 亚洲午夜久久久久久久久久久| 午夜国产精品理论片久久影院| 小明成人免费视频一区| 国产麻豆一区二区三区在线观看| 无码熟妇人妻av在线电影| 亚洲另类一区二区| 国产精品91一区| 免费成人黄色网| 国模私拍在线观看| 日韩精品福利| 一二三四视频社区在线| 韩国三级hd两男一女| 五月婷婷激情在线| 国产一区二区在线观看免费| 国产欧美日本亚洲精品一4区| 欧美超碰在线观看| h在线观看视频免费网站| 国产成人精品一区二| 日本深夜福利视频| 不卡一区二区中文字幕| 亚洲大全视频| 精品一二三四区| 99re8这里有精品热视频8在线| 亚洲国产成人影院播放| **网站欧美大片在线观看| 欧美一区二区三区在线视频| 国产在线视频福利| www.国产在线视频| 国产精品欧美一区二区三区| 免费偷拍视频网站| 欧美激情图区| 国产普通话bbwbbwbbw| 国产一区二区不卡视频| 一区在线观看免费| 日韩区在线观看| 亚洲精品一区国产| 国产精品黄视频| 久久久久久久久久国产| 国产日韩一级二级三级| 日本免费网站| 免费观看成年在线视频网站| 亚洲一区 视频| 亚洲黄色一级大片| 黑人狂躁日本娇小| 亚洲一二三区精品| 欧美xxxx做受欧美护士| 92裸体在线视频网站| 精品久久久久久久久久久久久| 99精品国产高清一区二区麻豆| 久久视频免费在线| 亚洲国产精品成人天堂| 精品动漫3d一区二区三区免费| 成人在线丰满少妇av| 日本欧美精品久久久| 加勒比久久高清| 91精品久久久久久久久久久久久| 国产成人免费高清| 亚洲综合小说区| 一区二区国产盗摄色噜噜| 欧美激情综合在线| 国产精品入口芒果| 毛片在线导航| av先锋影院| 日本888xxxx| 久久久久九九九九| www..com国产| 日本一区二区三区精品视频| 国产精品人人爽| 亚洲天堂一区在线| 亚洲成年人电影| 超碰97久久国产精品牛牛| 国产尤物一区二区在线| 国产在线一区二区三区欧美| 久久综合激情| 影音先锋国产资源站| 强伦女教师2:伦理在线观看| 一区二区在线视频播放| 国产精品二区二区三区| 亚洲石原莉奈一区二区在线观看| 亚洲免费观看高清完整版在线观看| 4438全国亚洲精品观看视频| 欧美成人精品| 日韩av片在线播放| 日本男女交配视频| 成人精品视频在线观看| 潘金莲激情呻吟欲求不满视频| 国产精品av一区| 美女隐私在线观看| 欧美亚洲综合在线| 成人性生交大免费看| 蜜桃免费在线视频| 一卡二卡三卡日韩欧美| 亚洲一本视频| 亚洲激情在线激情| 1024在线播放| 五月婷婷婷婷婷| 久久99国产精品免费网站| 国产精品成人午夜| 最新国产精品拍自在线播放| 国产亚洲精品日韩| 激情网站五月天| 婷婷综合久久中文字幕蜜桃三电影| 中文在线不卡| 在线免费av片| 国产精品无码久久久久成人app| 国产精品成人国产乱| 51xtv成人影院| 综合欧美国产视频二区| 国产自产在线视频| 日韩三级中文字幕| 一级α片免费看刺激高潮视频| 成人影院在线观看视频| 99久久久久| 欧美精品一区二区成人| 不卡av免费在线观看| 久久久精品欧美| 国产精品激情偷乱一区二区∴| 日韩一级在线视频| 欧美小视频在线观看| www.97av.com| 不卡电影免费在线播放一区| 精品日韩在线视频| 男人舔女人下面高潮视频| 国产免费一区二区三区在线观看| 亚洲麻豆视频| 日韩在线激情| 国产激情久久久久久熟女老人av| 亚洲欧美色一区| 自拍欧美一区| 91免费欧美精品| 视频一区二区综合| 日韩欧美精品一区二区综合视频| 久久国产中文字幕| 日韩一级片在线播放| 欧美一区二区三区的| 精品视频在线导航| 欧美91精品久久久久国产性生爱| 国产精品第六页| 色香欲www7777综合网| 久久99久久久精品欧美| 欧美黑粗硬大| 亚洲一区二区不卡视频| 欧美大片免费观看在线观看网站推荐| 四虎国产精品永久地址998| 免费男女羞羞的视频网站中文子暮| 日韩福利电影在线观看| 中文字幕在线一| 亚洲成人短视频| 影音先锋中文一区| 欧美大肥婆大肥bbbbb| 国产精品1000部啪视频| www·91·com| 看黄色免费网站| 亚洲久草在线| 欧美三级蜜桃2在线观看| 国产一级黄色| a级日韩大片| 国产在线精品一区| japan高清日本乱xxxx| 亚洲欧美日韩免费| 欧美日韩电影一区二区| 久久久性生活视频| 91免费在线看| 欧美人伦禁忌dvd放荡欲情| 国产精品乱码久久久| 欧洲高清一区二区| 新呦u视频一区二区| 欧美精品色综合| 国产免费av一区二区| 8x8x成人免费视频| 亚洲精品美女91| 欧美专区第一页| 亚洲天堂免费电影| 国产欧美一区二区精品久导航| 香蕉国产在线视频| 国产男女猛烈无遮挡在线喷水| 欧美最猛黑人xxxx黑人猛交3p| 亚洲午夜一二三区视频| 亚洲大片免费观看| 日韩中文字幕免费在线观看| 欧美金发大战黑人最粗videos| 国产区精品区| 国产日韩欧美中文在线| 西西大胆午夜视频| 中文精品一区二区| 91在线无精精品一区二区| 亚洲精品国产综合区久久久久久久| 欧美午夜不卡影院在线观看完整版免费| 国产精品入口麻豆| 91精品国产自产在线| 综合伊思人在钱三区| 国产91对白在线观看九色| 免费视频一二三区| 999在线观看免费大全电视剧| 精品国产乱码一区二区| 超碰免费在线观看| 午夜小视频在线观看| 国产香蕉成人综合精品视频| 夜夜嗨av一区二区三区| 老头老太做爰xxx视频| 8x8ⅹ国产精品一区二区二区| 天天摸天天干天天操| 精一区二区三区| 久久久久久18| www.久久伊人| 久久不射2019中文字幕| 亚洲av无码国产精品久久| 国产视频中文字幕| 日本少妇毛茸茸| 在线一级视频| 欧美白人猛性xxxxx交69| 日韩在线卡一卡二| 久久精品视频中文字幕| 伊人久久婷婷色综合98网| 丝袜美腿亚洲一区| 精品在线视频免费| 国内福利视频| 先锋影音av在线资源| 亚洲啪av永久无码精品放毛片| 最新天堂资源在线| 一级片免费在线观看| 成人免费公开视频| 日本中文字幕影院| 国产乱视频在线观看|