/www/libs/nette-dev/Application/Routers/MultiRouter.php
PHP | 100 lines | 51 code | 22 blank | 27 comment | 8 complexity | 583eee2d50f2c1cdf43fa854394069c3 MD5 | raw file
Possible License(s): BSD-3-Clause, MIT
- <?php
- /**
- * Nette Framework
- *
- * @copyright Copyright (c) 2004, 2010 David Grudl
- * @license http://nettephp.com/license Nette license
- * @link http://nettephp.com
- * @category Nette
- * @package Nette\Application
- */
- /**
- * The router broker.
- *
- * @copyright Copyright (c) 2004, 2010 David Grudl
- * @package Nette\Application
- */
- class MultiRouter extends ArrayList implements IRouter
- {
- /** @var array */
- private $cachedRoutes;
- public function __construct()
- {
- parent::__construct(NULL, 'IRouter');
- }
- /**
- * Maps HTTP request to a PresenterRequest object.
- * @param IHttpRequest
- * @return PresenterRequest|NULL
- */
- public function match(IHttpRequest $httpRequest)
- {
- foreach ($this as $route) {
- $appRequest = $route->match($httpRequest);
- if ($appRequest !== NULL) {
- return $appRequest;
- }
- }
- return NULL;
- }
- /**
- * Constructs absolute URL from PresenterRequest object.
- * @param IHttpRequest
- * @param PresenterRequest
- * @return string|NULL
- */
- public function constructUrl(PresenterRequest $appRequest, IHttpRequest $httpRequest)
- {
- if ($this->cachedRoutes === NULL) {
- $routes = array();
- $routes['*'] = array();
- foreach ($this as $route) {
- $presenter = $route instanceof Route ? $route->getTargetPresenter() : NULL;
- if ($presenter === FALSE) continue;
- if (is_string($presenter)) {
- $presenter = strtolower($presenter);
- if (!isset($routes[$presenter])) {
- $routes[$presenter] = $routes['*'];
- }
- $routes[$presenter][] = $route;
- } else {
- foreach ($routes as $id => $foo) {
- $routes[$id][] = $route;
- }
- }
- }
- $this->cachedRoutes = $routes;
- }
- $presenter = strtolower($appRequest->getPresenterName());
- if (!isset($this->cachedRoutes[$presenter])) $presenter = '*';
- foreach ($this->cachedRoutes[$presenter] as $route) {
- $uri = $route->constructUrl($appRequest, $httpRequest);
- if ($uri !== NULL) {
- return $uri;
- }
- }
- return NULL;
- }
- }