Route.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <?php namespace Dever;
  2. class Route
  3. {
  4. protected static $data = array();
  5. protected static $type = '';
  6. public static function input($key = false, $condition = '', $lang = '', $value = '')
  7. {
  8. if (!$key) {
  9. return self::$data;
  10. }
  11. if ($condition == 'set') {
  12. return self::$data[$key] = $lang;
  13. }
  14. if (is_string($key) && isset(self::$data[$key]) && self::$data[$key]) {
  15. $value = self::$data[$key];
  16. }
  17. if ($condition) {
  18. if (!$lang) {
  19. $lang = $key;
  20. }
  21. if (!$value) {
  22. Output::error($lang . '不能为空');
  23. }
  24. $state = true;
  25. if (strpos($condition, '/') === 0) {
  26. $state = preg_match($condition, $value);
  27. } elseif (function_exists($condition)) {
  28. $state = $condition($value);
  29. }
  30. if (!$state) {
  31. Output::error($lang . '验证无效');
  32. }
  33. }
  34. return $value;
  35. }
  36. public static function url($uri = false, $param = array())
  37. {
  38. if ($uri == false) {
  39. if (DEVER_APP_HOST) {
  40. $uri = DEVER_PROTO . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
  41. } else {
  42. $argv = array_merge(\Dever::json_decode($_SERVER['argv'][1]), $param);
  43. return $_SERVER['argv'][0] . ' ' . \Dever::json_encode($argv);
  44. }
  45. }
  46. if (strpos($uri, 'http') === 0) {
  47. if ($param) {
  48. $uri .= '&' . http_build_query($param);
  49. }
  50. return $uri;
  51. }
  52. if (strpos($uri, '/')) {
  53. $temp = explode('/', $uri);
  54. $project_name = $temp[0];
  55. } else {
  56. $project_name = DEVER_APP_NAME;
  57. }
  58. $project = Project::load($project_name);
  59. if (!$project) {
  60. Output::error('project not exists:' . $project_name);
  61. }
  62. if (!$uri) {
  63. return $project['url'];
  64. }
  65. if ($route = Config::get('setting')['route']) {
  66. if ($search = array_search($uri, $route)) {
  67. $uri = $search;
  68. }
  69. if ($param) {
  70. $query = '';
  71. $data = array();
  72. $i = 1;
  73. foreach ($param as $k => $v) {
  74. $query .= $k . '=$' . $i . '&';
  75. $data[$i] = $v;
  76. $i++;
  77. }
  78. $query = rtrim($query, '&');
  79. if ($key = array_search($uri . '?' . $query, $route)) {
  80. $i = 0;
  81. $uri = preg_replace_callback('/\(.*?\)/', function($param) use($data, &$i) {
  82. $i++;
  83. return $data[$i];
  84. }, $key);
  85. }
  86. }
  87. } elseif ($param) {
  88. $uri .= '&' . http_build_query($param);
  89. }
  90. return $project['url'] . self::$type . $uri;
  91. }
  92. public static function get()
  93. {
  94. if (!self::command()) {
  95. self::api();
  96. }
  97. self::match();
  98. self::filter(self::$data);
  99. if (isset(self::$data['uuid']) && isset(Config::get('setting')['redis']) && !\Dever\Helper\Redis::lock(self::$data['uuid'], 1, 10)) {
  100. Output::error('route repeat');
  101. }
  102. return self::$data;
  103. }
  104. protected static function command()
  105. {
  106. if (isset($_SERVER['argc'])) {
  107. global $argv;
  108. if (isset($argv[1]) && $argv[1]) {
  109. self::$data = \Dever::json_decode($argv[1]);
  110. }
  111. define('DEVER_PROTO', 'command');
  112. define('DEVER_APP_HOST', '');
  113. return true;
  114. }
  115. return false;
  116. }
  117. protected static function api()
  118. {
  119. self::$data = $_REQUEST;
  120. if (isset($_FILES) && $_FILES) {
  121. self::$data = array_merge(self::$data, $_FILES);
  122. }
  123. $pathinfo = self::pathinfo();
  124. if ($pathinfo) {
  125. self::$data['l'] = trim($pathinfo, '/');
  126. } else {
  127. self::$type = '?l=';
  128. }
  129. define('DEVER_PROTO', ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https' : 'http');
  130. define('DEVER_APP_HOST', DEVER_PROTO . '://' . $_SERVER['HTTP_HOST'] . ($_SERVER['SCRIPT_NAME'] ? substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], DEVER_ENTRY)) : DIRECTORY_SEPARATOR));
  131. }
  132. protected static function pathinfo()
  133. {
  134. $pathinfo = '';
  135. if (isset($_SERVER['PATH_INFO']) && $_SERVER['PATH_INFO']) {
  136. $pathinfo = $_SERVER['PATH_INFO'];
  137. } elseif (isset($_SERVER['ORIG_PATH_INFO'])) {
  138. $pathinfo = $_SERVER['ORIG_PATH_INFO'];
  139. }
  140. return $pathinfo;
  141. }
  142. public static function match()
  143. {
  144. if (!isset(self::$data['l'])) {
  145. Output::error('route not exists');
  146. }
  147. if ($route = Config::get('setting')['route']) {
  148. $value = self::$data['l'];
  149. if (isset($route[$value])) {
  150. self::$data['l'] = $route[$value];
  151. } else {
  152. foreach ($route as $k => $v) {
  153. $k = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $k));
  154. if (preg_match('#^' . $k . '$#', $value)) {
  155. if (strpos($v, '$') !== false && strpos($k, '(') !== false) {
  156. $v = preg_replace('#^' . $k . '$#', $v, $value);
  157. }
  158. if (strpos($v, '?')) {
  159. $temp = explode('?', $v);
  160. $v = $temp[0];
  161. parse_str($temp[1], $data);
  162. self::$data = array_merge($data, self::$data);
  163. }
  164. self::$data['l'] = $v;
  165. }
  166. }
  167. }
  168. }
  169. }
  170. protected static function filter(&$data)
  171. {
  172. if ($data) {
  173. foreach ($data as $k => $v) {
  174. if (is_array($v)) {
  175. self::filter($v);
  176. } else {
  177. if ($data[$k] == 'undefined') {
  178. $data[$k] = '';
  179. } else {
  180. $data[$k] = htmlspecialchars($v);
  181. }
  182. }
  183. }
  184. }
  185. }
  186. }