PageRenderTime 39ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/www/libs/nette-dev/Application/Routers/MultiRouter.php

https://github.com/bazo/Mokuji
PHP | 100 lines | 51 code | 22 blank | 27 comment | 8 complexity | 583eee2d50f2c1cdf43fa854394069c3 MD5 | raw file
Possible License(s): BSD-3-Clause, MIT
  1. <?php
  2. /**
  3. * Nette Framework
  4. *
  5. * @copyright Copyright (c) 2004, 2010 David Grudl
  6. * @license http://nettephp.com/license Nette license
  7. * @link http://nettephp.com
  8. * @category Nette
  9. * @package Nette\Application
  10. */
  11. /**
  12. * The router broker.
  13. *
  14. * @copyright Copyright (c) 2004, 2010 David Grudl
  15. * @package Nette\Application
  16. */
  17. class MultiRouter extends ArrayList implements IRouter
  18. {
  19. /** @var array */
  20. private $cachedRoutes;
  21. public function __construct()
  22. {
  23. parent::__construct(NULL, 'IRouter');
  24. }
  25. /**
  26. * Maps HTTP request to a PresenterRequest object.
  27. * @param IHttpRequest
  28. * @return PresenterRequest|NULL
  29. */
  30. public function match(IHttpRequest $httpRequest)
  31. {
  32. foreach ($this as $route) {
  33. $appRequest = $route->match($httpRequest);
  34. if ($appRequest !== NULL) {
  35. return $appRequest;
  36. }
  37. }
  38. return NULL;
  39. }
  40. /**
  41. * Constructs absolute URL from PresenterRequest object.
  42. * @param IHttpRequest
  43. * @param PresenterRequest
  44. * @return string|NULL
  45. */
  46. public function constructUrl(PresenterRequest $appRequest, IHttpRequest $httpRequest)
  47. {
  48. if ($this->cachedRoutes === NULL) {
  49. $routes = array();
  50. $routes['*'] = array();
  51. foreach ($this as $route) {
  52. $presenter = $route instanceof Route ? $route->getTargetPresenter() : NULL;
  53. if ($presenter === FALSE) continue;
  54. if (is_string($presenter)) {
  55. $presenter = strtolower($presenter);
  56. if (!isset($routes[$presenter])) {
  57. $routes[$presenter] = $routes['*'];
  58. }
  59. $routes[$presenter][] = $route;
  60. } else {
  61. foreach ($routes as $id => $foo) {
  62. $routes[$id][] = $route;
  63. }
  64. }
  65. }
  66. $this->cachedRoutes = $routes;
  67. }
  68. $presenter = strtolower($appRequest->getPresenterName());
  69. if (!isset($this->cachedRoutes[$presenter])) $presenter = '*';
  70. foreach ($this->cachedRoutes[$presenter] as $route) {
  71. $uri = $route->constructUrl($appRequest, $httpRequest);
  72. if ($uri !== NULL) {
  73. return $uri;
  74. }
  75. }
  76. return NULL;
  77. }
  78. }