Просмотр файла engine/classes/router.class.php

Размер файла: 5.25Kb
  1. <?php
  2.  
  3. /**
  4. * @author Tadochi <Tadochi@spaces.ru>
  5. * @version 0.4 beta
  6. * @copyright SecWind IWC
  7. * Точно не понял каким должен быть "router" класс, но мне так нрав.. ))
  8. * Задача класса - верикация маршрута
  9. */
  10.  
  11. Class Router
  12. {
  13. /**
  14. * @var (array) $query URI, разбитый на сегменты
  15. *
  16. * URI - http://ru.wikipedia.org/wiki/URI
  17. * То что идет после ? в адресной строке. Как я понял
  18. *
  19. * Свойство содержит результат explode('/', $uri)
  20. * То есть, если $uri = 'test:test1/var:text';
  21. * $query будет содержать:
  22. * array ([test] => 'test1', [var] => 'text')
  23. */
  24.  
  25. private $query;
  26.  
  27.  
  28. /**
  29. * @var (string) $uri URI с которым будет работать
  30. */
  31.  
  32. public function __construct($uri = null)
  33. {
  34. $this->parse($uri);
  35. }
  36.  
  37.  
  38.  
  39. /**
  40. * Парсинг URI
  41. * Если URI примерно таков: news/id:2/page:4
  42. * То в $this->query будет массив с такими ключами: news, id, page.
  43. * А значения соответственно: false, 2, 4
  44. *
  45. * $uri (string) описан в комментарии к __construct
  46. * Если $uri = null, будет использована $_SERVER['QUERY_STRING']
  47. */
  48.  
  49. public function parse($uri)
  50. {
  51. $queries = explode('/', isset($uri) ? $uri : $_SERVER['QUERY_STRING']);
  52. foreach($queries as $query)
  53. {
  54. $arr = explode(':', $query);
  55. !empty($arr[0]) ? // Если передан такой URI: test:sometext/wt:f///
  56. (
  57. $this->query[$arr[0]] = !empty($arr[1]) ? $arr[1] : false
  58. )
  59. : null;
  60. }
  61. return $this;
  62. }
  63.  
  64.  
  65. /**
  66. * @param $var (string) Для лаконичного обращения
  67. * $this->var то же что $this->query['var']
  68. */
  69.  
  70. public function __get($var)
  71. {
  72. return isset($this->query[$var]) ? $this->query[$var] : false;
  73. }
  74.  
  75.  
  76.  
  77. /**
  78. * Проверка сегментов
  79. *
  80. * @param $params (array) массив параметров
  81. * Ключ (key) - Сегмент URI
  82. * Значение (value) - Массив для "проверки". Подробнее ниже
  83. *
  84. *
  85. * Сегмент URI можно проверить следующими способами:
  86. *
  87. * require - сегмент обязателен, иначе будет "выброшена" ошибка
  88. *
  89. * numeric - сегмент должен быть числовым, иначе будет выброшена ошибка
  90. * В качестве значения, писать название функции, которое вызовится. Например: round, abs, intval и тд
  91. * По дефолту intval
  92. *
  93. * maybe_values - Сегмент должен состоять из допустимых значений, указанных через запятую.
  94. * Например array('maybe_values' => 'create,read,update,delete')
  95. * Если сегмента URI нет в допустимых значениях, будет выброшена ошибка
  96. *
  97. * call_function - Сегмент будет проверятся пользовательской функцией, при возврате false, работа класса остановится
  98. */
  99.  
  100. public function check($params)
  101. {
  102. foreach($params as $param => $options)
  103. {
  104. if (empty($this->query[$param]))
  105. {
  106. if (!empty($options['require']) && !isset($options['default']))
  107. trigger_error('<b>Warning</b>: Свойство Router::'.$param . ' не определено', E_USER_ERROR);
  108. else
  109. $this->query[$param] = $options['default'];
  110. }
  111. if (!empty($options['numeric']))
  112. {
  113. if (!is_numeric($this->query[$param]))
  114. {
  115. trigger_error('<b>Warning</b>: Свойство Router::'.$param . ' не является числом', E_USER_ERROR);
  116. }
  117. elseif (is_callable($options['numeric']))
  118. {
  119. $this->query[$param] = $options['numeric']($this->query[$param]);
  120. }
  121. }
  122.  
  123. if (!empty($options['maybe_values']))
  124. {
  125. if (!in_array($this->query[$param], explode(',', $options['maybe_values'])))
  126. {
  127. trigger_error('
  128. <b>Warning</b>: Свойство Router::'.$param . ' имеет недопустимое значение.
  129. Допустимые значения: '. $options['maybe_values'], E_USER_ERROR);
  130. }
  131. }
  132.  
  133. if (!empty($options['call_function']))
  134. {
  135. if (!call_user_func($options['call_function'], $this->query[$param]))
  136. {
  137. trigger_error('
  138. <b>Warning</b>: Работа приостановлена функцией '.$options['call_function'] . ',
  139. при обработке Router::'. $param, E_USER_ERROR);
  140. }
  141. }
  142. }
  143. }
  144.  
  145.  
  146. /**
  147. * Сброс параметров
  148. * Чтобы не создавать кучу объектов
  149. * $route = new router;
  150. * $route->check($array);
  151. * $route->reset()->parse($new_uri)->check($array)->reset();
  152. * Наверное выпилю!
  153. */
  154.  
  155. public function reset()
  156. {
  157. $this->query = array();
  158. return $this;
  159. }
  160. }