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.

112 lines
2.8 KiB

  1. <?php
  2. /**
  3. * Класс для работы с роутерами
  4. *
  5. * @copyright
  6. * @link
  7. * @package Majestic
  8. * @subpackage Core
  9. * @since
  10. * @version SVN: $Id$
  11. * @filesource $URL$
  12. */
  13. final class Router
  14. {
  15. protected $routes = array();
  16. /**
  17. * Добавить роутер
  18. *
  19. * @param string $name - имя роутера
  20. * @param string $path - путь
  21. * @param string $action - имя действия
  22. * @param array $params - массив параметров
  23. */
  24. function add($name, $path, $action, $params = array())
  25. {
  26. $this->routes[$name] = new Route($path, $action, $params);
  27. }
  28. /**
  29. * Установить декоратор для роута (действия), отличный от стандартного
  30. *
  31. * @param string $name - имя роута (действия)
  32. * @param string $decorator - имя декоратора
  33. */
  34. function setDecorator($name, $decorator)
  35. {
  36. if (isset($this->routes[$name])) {
  37. $this->routes[$name]->decorator = $decorator.DECORATOR_POSTFIX;
  38. }
  39. }
  40. /**
  41. * Найти роутер соответствующий заданному пути
  42. *
  43. * @param stirng $path - путь
  44. * @return Route - роутер
  45. */
  46. function proccess($path)
  47. {
  48. $path = explode('/', $path);
  49. foreach ($this->routes as $name => $route) {
  50. if ($route->match($path)) {
  51. $route->action .= ACTION_POSTFIX;
  52. Env::setParams($route->params);
  53. return $route;
  54. }
  55. }
  56. throw new Exception(E_404);
  57. }
  58. }
  59. /**
  60. * Роутер
  61. *
  62. */
  63. final class Route
  64. {
  65. const URL_VARIABLE = '&';
  66. protected $path;
  67. public $decorator = DEFAULT_DECORATOR;
  68. public $action;
  69. public $params;
  70. function __construct($path, $action, $params=array())
  71. {
  72. $this->path = $path;
  73. $this->action = $action;
  74. $this->params = $params;
  75. }
  76. /**
  77. * Проверяет соответствие роутера и пути
  78. *
  79. * @param string $path - путь для сравнения
  80. * @return boolean - соответствует или нет
  81. */
  82. function match($path_arr)
  83. {
  84. $parts = explode('/', $this->path);
  85. $cnt = count($parts);
  86. if (end($parts) == self::URL_VARIABLE) {
  87. $cnt--;
  88. } elseif ($cnt != count($path_arr)) {
  89. return false;
  90. }
  91. for ($i=0; $i<$cnt; $i++) {
  92. if (substr($parts[$i], 0, 1) == self::URL_VARIABLE) {
  93. $this->params[substr($parts[$i], 1)] = $path_arr[$i];
  94. } elseif ($parts[$i] != $path_arr[$i]) {
  95. return false;
  96. }
  97. }
  98. return true;
  99. }
  100. }
  101. ?>