web/lib/Zend/Controller/Router/Rewrite.php
changeset 1230 68c69c656a2c
parent 807 877f952ae2bd
equal deleted inserted replaced
1229:5a6b6e770365 1230:68c69c656a2c
    13  * to license@zend.com so we can send you a copy immediately.
    13  * to license@zend.com so we can send you a copy immediately.
    14  *
    14  *
    15  * @category   Zend
    15  * @category   Zend
    16  * @package    Zend_Controller
    16  * @package    Zend_Controller
    17  * @subpackage Router
    17  * @subpackage Router
    18  * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
    18  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
    19  * @version    $Id: Rewrite.php 24593 2012-01-05 20:35:02Z matthew $
    19  * @version    $Id$
    20  * @license    http://framework.zend.com/license/new-bsd     New BSD License
    20  * @license    http://framework.zend.com/license/new-bsd     New BSD License
    21  */
    21  */
    22 
    22 
    23 /** Zend_Controller_Router_Abstract */
    23 /** Zend_Controller_Router_Abstract */
    24 require_once 'Zend/Controller/Router/Abstract.php';
    24 require_once 'Zend/Controller/Router/Abstract.php';
    29 /**
    29 /**
    30  * Ruby routing based Router.
    30  * Ruby routing based Router.
    31  *
    31  *
    32  * @package    Zend_Controller
    32  * @package    Zend_Controller
    33  * @subpackage Router
    33  * @subpackage Router
    34  * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
    34  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
    35  * @license    http://framework.zend.com/license/new-bsd     New BSD License
    35  * @license    http://framework.zend.com/license/new-bsd     New BSD License
    36  * @see        http://manuals.rubyonrails.com/read/chapter/65
    36  * @see        http://manuals.rubyonrails.com/read/chapter/65
    37  */
    37  */
    38 class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract
    38 class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract
    39 {
    39 {
    53     protected $_routes = array();
    53     protected $_routes = array();
    54 
    54 
    55     /**
    55     /**
    56      * Currently matched route
    56      * Currently matched route
    57      *
    57      *
    58      * @var Zend_Controller_Router_Route_Interface
    58      * @var string
    59      */
    59      */
    60     protected $_currentRoute = null;
    60     protected $_currentRoute = null;
    61 
    61 
    62     /**
    62     /**
    63      * Global parameters given to all routes
    63      * Global parameters given to all routes
    88      */
    88      */
    89     public function addDefaultRoutes()
    89     public function addDefaultRoutes()
    90     {
    90     {
    91         if (!$this->hasRoute('default')) {
    91         if (!$this->hasRoute('default')) {
    92             $dispatcher = $this->getFrontController()->getDispatcher();
    92             $dispatcher = $this->getFrontController()->getDispatcher();
    93             $request = $this->getFrontController()->getRequest();
    93             $request    = $this->getFrontController()->getRequest();
    94 
    94 
    95             require_once 'Zend/Controller/Router/Route/Module.php';
    95             require_once 'Zend/Controller/Router/Route/Module.php';
    96             $compat = new Zend_Controller_Router_Route_Module(array(), $dispatcher, $request);
    96             $compat = new Zend_Controller_Router_Route_Module(array(), $dispatcher, $request);
    97 
    97 
    98             $this->_routes = array('default' => $compat) + $this->_routes;
    98             $this->_routes = array('default' => $compat) + $this->_routes;
   104     /**
   104     /**
   105      * Add route to the route chain
   105      * Add route to the route chain
   106      *
   106      *
   107      * If route contains method setRequest(), it is initialized with a request object
   107      * If route contains method setRequest(), it is initialized with a request object
   108      *
   108      *
   109      * @param  string                                 $name       Name of the route
   109      * @param  string                                 $name  Name of the route
   110      * @param  Zend_Controller_Router_Route_Interface $route      Instance of the route
   110      * @param  Zend_Controller_Router_Route_Interface $route Instance of the route
   111      * @return Zend_Controller_Router_Rewrite
   111      * @return Zend_Controller_Router_Rewrite
   112      */
   112      */
   113     public function addRoute($name, Zend_Controller_Router_Route_Interface $route)
   113     public function addRoute($name, Zend_Controller_Router_Route_Interface $route)
   114     {
   114     {
   115         if (method_exists($route, 'setRequest')) {
   115         if (method_exists($route, 'setRequest')) {
   125      * Add routes to the route chain
   125      * Add routes to the route chain
   126      *
   126      *
   127      * @param  array $routes Array of routes with names as keys and routes as values
   127      * @param  array $routes Array of routes with names as keys and routes as values
   128      * @return Zend_Controller_Router_Rewrite
   128      * @return Zend_Controller_Router_Rewrite
   129      */
   129      */
   130     public function addRoutes($routes) {
   130     public function addRoutes($routes)
       
   131     {
   131         foreach ($routes as $name => $route) {
   132         foreach ($routes as $name => $route) {
   132             $this->addRoute($name, $route);
   133             $this->addRoute($name, $route);
   133         }
   134         }
   134 
   135 
   135         return $this;
   136         return $this;
   213         if (!class_exists($class)) {
   214         if (!class_exists($class)) {
   214             require_once 'Zend/Loader.php';
   215             require_once 'Zend/Loader.php';
   215             Zend_Loader::loadClass($class);
   216             Zend_Loader::loadClass($class);
   216         }
   217         }
   217 
   218 
   218         $route = call_user_func(array($class, 'getInstance'), $info);
   219         $route = call_user_func(
       
   220             array(
       
   221                 $class,
       
   222                 'getInstance'
       
   223             ), $info
       
   224         );
   219 
   225 
   220         if (isset($info->abstract) && $info->abstract && method_exists($route, 'isAbstract')) {
   226         if (isset($info->abstract) && $info->abstract && method_exists($route, 'isAbstract')) {
   221             $route->isAbstract(true);
   227             $route->isAbstract(true);
   222         }
   228         }
   223 
   229 
   230      * @param  string                                 $name
   236      * @param  string                                 $name
   231      * @param  Zend_Controller_Router_Route_Interface $route
   237      * @param  Zend_Controller_Router_Route_Interface $route
   232      * @param  Zend_Config                            $childRoutesInfo
   238      * @param  Zend_Config                            $childRoutesInfo
   233      * @return void
   239      * @return void
   234      */
   240      */
   235     protected function _addChainRoutesFromConfig($name,
   241     protected function _addChainRoutesFromConfig(
   236                                                  Zend_Controller_Router_Route_Interface $route,
   242         $name,
   237                                                  Zend_Config $childRoutesInfo)
   243         Zend_Controller_Router_Route_Interface $route,
       
   244         Zend_Config $childRoutesInfo
       
   245     )
   238     {
   246     {
   239         foreach ($childRoutesInfo as $childRouteName => $childRouteInfo) {
   247         foreach ($childRoutesInfo as $childRouteName => $childRouteInfo) {
   240             if (is_string($childRouteInfo)) {
   248             if (is_string($childRouteInfo)) {
   241                 $childRouteName = $childRouteInfo;
   249                 $childRouteName = $childRouteInfo;
   242                 $childRoute     = $this->getRoute($childRouteName);
   250                 $childRoute     = $this->getRoute($childRouteName);
   281     }
   289     }
   282 
   290 
   283     /**
   291     /**
   284      * Remove all standard default routes
   292      * Remove all standard default routes
   285      *
   293      *
   286      * @param  Zend_Controller_Router_Route_Interface Route
       
   287      * @return Zend_Controller_Router_Rewrite
   294      * @return Zend_Controller_Router_Rewrite
   288      */
   295      */
   289     public function removeDefaultRoutes()
   296     public function removeDefaultRoutes()
   290     {
   297     {
   291         $this->_useDefaultRoutes = false;
   298         $this->_useDefaultRoutes = false;
   331     {
   338     {
   332         if (!isset($this->_currentRoute)) {
   339         if (!isset($this->_currentRoute)) {
   333             require_once 'Zend/Controller/Router/Exception.php';
   340             require_once 'Zend/Controller/Router/Exception.php';
   334             throw new Zend_Controller_Router_Exception("Current route is not defined");
   341             throw new Zend_Controller_Router_Exception("Current route is not defined");
   335         }
   342         }
       
   343 
   336         return $this->getRoute($this->_currentRoute);
   344         return $this->getRoute($this->_currentRoute);
   337     }
   345     }
   338 
   346 
   339     /**
   347     /**
   340      * Retrieve a name of currently matched route
   348      * Retrieve a name of currently matched route
   341      *
   349      *
   342      * @throws Zend_Controller_Router_Exception
   350      * @throws Zend_Controller_Router_Exception
   343      * @return Zend_Controller_Router_Route_Interface Route object
   351      * @return string Route name
   344      */
   352      */
   345     public function getCurrentRouteName()
   353     public function getCurrentRouteName()
   346     {
   354     {
   347         if (!isset($this->_currentRoute)) {
   355         if (!isset($this->_currentRoute)) {
   348             require_once 'Zend/Controller/Router/Exception.php';
   356             require_once 'Zend/Controller/Router/Exception.php';
   349             throw new Zend_Controller_Router_Exception("Current route is not defined");
   357             throw new Zend_Controller_Router_Exception("Current route is not defined");
   350         }
   358         }
       
   359 
   351         return $this->_currentRoute;
   360         return $this->_currentRoute;
   352     }
   361     }
   353 
   362 
   354     /**
   363     /**
   355      * Retrieve an array of routes added to the route chain
   364      * Retrieve an array of routes added to the route chain
   363 
   372 
   364     /**
   373     /**
   365      * Find a matching route to the current PATH_INFO and inject
   374      * Find a matching route to the current PATH_INFO and inject
   366      * returning values to the Request object.
   375      * returning values to the Request object.
   367      *
   376      *
       
   377      * @param Zend_Controller_Request_Abstract $request
   368      * @throws Zend_Controller_Router_Exception
   378      * @throws Zend_Controller_Router_Exception
   369      * @return Zend_Controller_Request_Abstract Request object
   379      * @return Zend_Controller_Request_Abstract Request object
   370      */
   380      */
   371     public function route(Zend_Controller_Request_Abstract $request)
   381     public function route(Zend_Controller_Request_Abstract $request)
   372     {
   382     {
   373         if (!$request instanceof Zend_Controller_Request_Http) {
   383         if (!$request instanceof Zend_Controller_Request_Http) {
   374             require_once 'Zend/Controller/Router/Exception.php';
   384             require_once 'Zend/Controller/Router/Exception.php';
   375             throw new Zend_Controller_Router_Exception('Zend_Controller_Router_Rewrite requires a Zend_Controller_Request_Http-based request object');
   385             throw new Zend_Controller_Router_Exception(
       
   386                 'Zend_Controller_Router_Rewrite requires a Zend_Controller_Request_Http-based request object'
       
   387             );
   376         }
   388         }
   377 
   389 
   378         if ($this->_useDefaultRoutes) {
   390         if ($this->_useDefaultRoutes) {
   379             $this->addDefaultRoutes();
   391             $this->addDefaultRoutes();
   380         }
   392         }
   401                 $routeMatched        = true;
   413                 $routeMatched        = true;
   402                 break;
   414                 break;
   403             }
   415             }
   404         }
   416         }
   405 
   417 
   406          if (!$routeMatched) {
   418         if (!$routeMatched) {
   407              require_once 'Zend/Controller/Router/Exception.php';
   419             require_once 'Zend/Controller/Router/Exception.php';
   408              throw new Zend_Controller_Router_Exception('No route matched the request', 404);
   420             throw new Zend_Controller_Router_Exception('No route matched the request', 404);
   409          }
   421         }
   410 
   422 
   411         if($this->_useCurrentParamsAsGlobal) {
   423         if ($this->_useCurrentParamsAsGlobal) {
   412             $params = $request->getParams();
   424             $params = $request->getParams();
   413             foreach($params as $param => $value) {
   425             foreach ($params as $param => $value) {
   414                 $this->setGlobalParam($param, $value);
   426                 $this->setGlobalParam($param, $value);
   415             }
   427             }
   416         }
   428         }
   417 
   429 
   418         return $request;
   430         return $request;
   419 
   431     }
   420     }
   432 
   421 
   433     /**
       
   434      * Sets parameters for request object
       
   435      *
       
   436      * Module name, controller name and action name
       
   437      *
       
   438      * @param Zend_Controller_Request_Abstract $request
       
   439      * @param array                            $params
       
   440      */
   422     protected function _setRequestParams($request, $params)
   441     protected function _setRequestParams($request, $params)
   423     {
   442     {
   424         foreach ($params as $param => $value) {
   443         foreach ($params as $param => $value) {
   425 
   444 
   426             $request->setParam($param, $value);
   445             $request->setParam($param, $value);
   432                 $request->setControllerName($value);
   451                 $request->setControllerName($value);
   433             }
   452             }
   434             if ($param === $request->getActionKey()) {
   453             if ($param === $request->getActionKey()) {
   435                 $request->setActionName($value);
   454                 $request->setActionName($value);
   436             }
   455             }
   437 
       
   438         }
   456         }
   439     }
   457     }
   440 
   458 
   441     /**
   459     /**
   442      * Generates a URL path that can be used in URL creation, redirection, etc.
   460      * Generates a URL path that can be used in URL creation, redirection, etc.
   443      *
   461      *
   444      * @param  array $userParams Options passed by a user used to override parameters
   462      * @param  array $userParams Options passed by a user used to override parameters
   445      * @param  mixed $name The name of a Route to use
   463      * @param  mixed $name       The name of a Route to use
   446      * @param  bool $reset Whether to reset to the route defaults ignoring URL params
   464      * @param  bool  $reset      Whether to reset to the route defaults ignoring URL params
   447      * @param  bool $encode Tells to encode URL parts on output
   465      * @param  bool  $encode     Tells to encode URL parts on output
   448      * @throws Zend_Controller_Router_Exception
   466      * @throws Zend_Controller_Router_Exception
   449      * @return string Resulting absolute URL path
   467      * @return string Resulting absolute URL path
   450      */
   468      */
   451     public function assemble($userParams, $name = null, $reset = false, $encode = true)
   469     public function assemble($userParams, $name = null, $reset = false, $encode = true)
   452     {
   470     {
   453         if (!is_array($userParams)) {
   471         if (!is_array($userParams)) {
   454             require_once 'Zend/Controller/Router/Exception.php';
   472             require_once 'Zend/Controller/Router/Exception.php';
   455             throw new Zend_Controller_Router_Exception('userParams must be an array');
   473             throw new Zend_Controller_Router_Exception('userParams must be an array');
   456         }
   474         }
   457         
   475 
   458         if ($name == null) {
   476         if ($name == null) {
   459             try {
   477             try {
   460                 $name = $this->getCurrentRouteName();
   478                 $name = $this->getCurrentRouteName();
   461             } catch (Zend_Controller_Router_Exception $e) {
   479             } catch (Zend_Controller_Router_Exception $e) {
   462                 $name = 'default';
   480                 $name = 'default';
   478 
   496 
   479     /**
   497     /**
   480      * Set a global parameter
   498      * Set a global parameter
   481      *
   499      *
   482      * @param  string $name
   500      * @param  string $name
   483      * @param  mixed $value
   501      * @param  mixed  $value
   484      * @return Zend_Controller_Router_Rewrite
   502      * @return Zend_Controller_Router_Rewrite
   485      */
   503      */
   486     public function setGlobalParam($name, $value)
   504     public function setGlobalParam($name, $value)
   487     {
   505     {
   488         $this->_globalParams[$name] = $value;
   506         $this->_globalParams[$name] = $value;
   494      * Set the separator to use with chain names
   512      * Set the separator to use with chain names
   495      *
   513      *
   496      * @param string $separator The separator to use
   514      * @param string $separator The separator to use
   497      * @return Zend_Controller_Router_Rewrite
   515      * @return Zend_Controller_Router_Rewrite
   498      */
   516      */
   499     public function setChainNameSeparator($separator) {
   517     public function setChainNameSeparator($separator)
       
   518     {
   500         $this->_chainNameSeparator = $separator;
   519         $this->_chainNameSeparator = $separator;
   501 
   520 
   502         return $this;
   521         return $this;
   503     }
   522     }
   504 
   523 
   505     /**
   524     /**
   506      * Get the separator to use for chain names
   525      * Get the separator to use for chain names
   507      *
   526      *
   508      * @return string
   527      * @return string
   509      */
   528      */
   510     public function getChainNameSeparator() {
   529     public function getChainNameSeparator()
       
   530     {
   511         return $this->_chainNameSeparator;
   531         return $this->_chainNameSeparator;
   512     }
   532     }
   513 
   533 
   514     /**
   534     /**
   515      * Determines/returns whether to use the request parameters as global parameters.
   535      * Determines/returns whether to use the request parameters as global parameters.
   516      *
   536      *
   517      * @param boolean|null $use
   537      * @param boolean|null $use
   518      *           Null/unset when you want to retrieve the current state.
   538      *              Null/unset when you want to retrieve the current state.
   519      *           True when request parameters should be global, false otherwise
   539      *              True when request parameters should be global, false otherwise
   520      * @return boolean|Zend_Controller_Router_Rewrite
   540      * @return boolean|Zend_Controller_Router_Rewrite
   521      *              Returns a boolean if first param isn't set, returns an
   541      *              Returns a boolean if first param isn't set, returns an
   522      *              instance of Zend_Controller_Router_Rewrite otherwise.
   542      *              instance of Zend_Controller_Router_Rewrite otherwise.
   523      *
   543      *
   524      */
   544      */
   525     public function useRequestParametersAsGlobal($use = null) {
   545     public function useRequestParametersAsGlobal($use = null)
   526         if($use === null) {
   546     {
       
   547         if ($use === null) {
   527             return $this->_useCurrentParamsAsGlobal;
   548             return $this->_useCurrentParamsAsGlobal;
   528         }
   549         }
   529 
   550 
   530         $this->_useCurrentParamsAsGlobal = (bool) $use;
   551         $this->_useCurrentParamsAsGlobal = (bool)$use;
   531 
   552 
   532         return $this;
   553         return $this;
   533     }
   554     }
   534 }
   555 }