You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

128 lines
2.7 KiB

10 years ago
12 years ago
12 years ago
10 years ago
12 years ago
10 years ago
12 years ago
12 years ago
10 years ago
10 years ago
  1. <?php namespace Majestic\App\Router;
  2. /**
  3. * @copyright NetMonsters <team@netmonsters.ru>
  4. * @link http://netmonsters.ru
  5. * @package Majestic
  6. * @subpackage app
  7. * @since 2010-02-25
  8. */
  9. class Router
  10. {
  11. /**
  12. * @var Route[]
  13. */
  14. protected $routes = array();
  15. /**
  16. * @var string
  17. */
  18. protected $route_name;
  19. protected $default_layout = 'Default';
  20. protected $error_layout = 'Error';
  21. /**
  22. * @var Route
  23. */
  24. protected $route;
  25. public function add($name, $route, $action, $params = array(), $layout = null)
  26. {
  27. if (!$layout) {
  28. $layout = $this->default_layout;
  29. }
  30. $this->routes[$name] = new Route($route, $action, $params, $layout);
  31. }
  32. /**
  33. * @param $request
  34. * @return bool|Route
  35. */
  36. public function route($request)
  37. {
  38. $req = explode('/', trim($request, '/'));
  39. foreach ($this->routes as $name => $route) {
  40. if ($route->match($req)) {
  41. $this->route_name = $name;
  42. $this->route = $route;
  43. \Majestic\Env::setParams($route->getParams());
  44. return $this->route;
  45. }
  46. }
  47. return false;
  48. }
  49. /**
  50. * Set default layout name
  51. * @param string $layout
  52. */
  53. public function setDefaultLayout($layout = 'Default')
  54. {
  55. $this->default_layout = $layout;
  56. }
  57. /**
  58. * Sets the name of error page layout
  59. * @param string $layout
  60. */
  61. public function setErrorLayout($layout = 'Error')
  62. {
  63. $this->error_layout = $layout;
  64. }
  65. /**
  66. * Returns error layout name
  67. * @return string Error layout name
  68. */
  69. public function getErrorLayout()
  70. {
  71. return $this->error_layout . 'Layout';
  72. }
  73. /**
  74. * Return current router name
  75. * @return string
  76. */
  77. public function getRouteName()
  78. {
  79. return $this->route_name;
  80. }
  81. /**
  82. * @param null|string $name
  83. * @return Route
  84. * @throws \ErrorException
  85. */
  86. public function getRoute($name = null)
  87. {
  88. if (is_null($name)) {
  89. return $this->route;
  90. } else {
  91. if ($this->routeIsExists($name)) {
  92. return $this->getRouteByName($name);
  93. } else {
  94. throw new \ErrorException('Unknown route name: "' . $name . '".');
  95. }
  96. }
  97. }
  98. /**
  99. * @param string $name
  100. * @return bool
  101. */
  102. public function routeIsExists($name)
  103. {
  104. return array_key_exists($name, $this->routes);
  105. }
  106. /**
  107. * @param string $name
  108. * @return Route
  109. */
  110. protected function getRouteByName($name)
  111. {
  112. return $this->routes[$name];
  113. }
  114. }