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