123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- <?php namespace Dever;
- class Route
- {
- protected static $data = array();
- protected static $type = '';
- public static function input($key = false, $condition = '', $lang = '', $value = '')
- {
- if (!$key) {
- return self::$data;
- }
- if ($condition == 'set') {
- return self::$data[$key] = $lang;
- }
- if (is_string($key) && isset(self::$data[$key]) && self::$data[$key]) {
- $value = self::$data[$key];
- }
- if ($condition) {
- if (!$lang) {
- $lang = $key;
- }
- if (!$value) {
- Output::error($lang . '不能为空');
- }
- $state = true;
- if (strpos($condition, '/') === 0) {
- $state = preg_match($condition, $value);
- } elseif (function_exists($condition)) {
- $state = $condition($value);
- }
- if (!$state) {
- Output::error($lang . '验证无效');
- }
- }
- return $value;
- }
- public static function url($uri = false, $param = array())
- {
- if ($uri == false) {
- if (DEVER_APP_HOST) {
- $uri = DEVER_PROTO . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
- } else {
- $argv = array_merge(\Dever::json_decode($_SERVER['argv'][1]), $param);
- return $_SERVER['argv'][0] . ' ' . \Dever::json_encode($argv);
- }
- }
- if (strpos($uri, 'http') === 0) {
- if ($param) {
- $uri .= '&' . http_build_query($param);
- }
- return $uri;
- }
- if (strpos($uri, '/')) {
- $temp = explode('/', $uri);
- $project_name = $temp[0];
- } else {
- $project_name = DEVER_APP_NAME;
- }
- $project = Project::load($project_name);
- if (!$project) {
- Output::error('project not exists:' . $project_name);
- }
- if (!$uri) {
- return $project['url'];
- }
- if ($route = Config::get('setting')['route']) {
- if ($search = array_search($uri, $route)) {
- $uri = $search;
- }
- if ($param) {
- $query = '';
- $data = array();
- $i = 1;
- foreach ($param as $k => $v) {
- $query .= $k . '=$' . $i . '&';
- $data[$i] = $v;
- $i++;
- }
- $query = rtrim($query, '&');
- if ($key = array_search($uri . '?' . $query, $route)) {
- $i = 0;
- $uri = preg_replace_callback('/\(.*?\)/', function($param) use($data, &$i) {
- $i++;
- return $data[$i];
- }, $key);
- }
- }
- } elseif ($param) {
- $uri .= '&' . http_build_query($param);
- }
- return $project['url'] . self::$type . $uri;
- }
- public static function get()
- {
- if (!self::command()) {
- self::api();
- }
- self::match();
- self::filter(self::$data);
- if (isset(self::$data['uuid']) && isset(Config::get('setting')['redis']) && !\Dever\Helper\Redis::lock(self::$data['uuid'], 1, 10)) {
- Output::error('route repeat');
- }
- return self::$data;
- }
- protected static function command()
- {
- if (isset($_SERVER['argc'])) {
- global $argv;
- if (isset($argv[1]) && $argv[1]) {
- self::$data = \Dever::json_decode($argv[1]);
- }
- define('DEVER_PROTO', 'command');
- define('DEVER_APP_HOST', '');
- return true;
- }
- return false;
- }
- protected static function api()
- {
- self::$data = $_REQUEST;
- if (isset($_FILES) && $_FILES) {
- self::$data = array_merge(self::$data, $_FILES);
- }
- $pathinfo = self::pathinfo();
- if ($pathinfo) {
- self::$data['l'] = trim($pathinfo, '/');
- } else {
- self::$type = '?l=';
- }
- define('DEVER_PROTO', ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https' : 'http');
- 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));
- }
- protected static function pathinfo()
- {
- $pathinfo = '';
- if (isset($_SERVER['PATH_INFO']) && $_SERVER['PATH_INFO']) {
- $pathinfo = $_SERVER['PATH_INFO'];
- } elseif (isset($_SERVER['ORIG_PATH_INFO'])) {
- $pathinfo = $_SERVER['ORIG_PATH_INFO'];
- }
- return $pathinfo;
- }
- public static function match()
- {
- if (!isset(self::$data['l'])) {
- Output::error('route not exists');
- }
- if ($route = Config::get('setting')['route']) {
- $value = self::$data['l'];
- if (isset($route[$value])) {
- self::$data['l'] = $route[$value];
- } else {
- foreach ($route as $k => $v) {
- $k = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $k));
- if (preg_match('#^' . $k . '$#', $value)) {
- if (strpos($v, '$') !== false && strpos($k, '(') !== false) {
- $v = preg_replace('#^' . $k . '$#', $v, $value);
- }
- if (strpos($v, '?')) {
- $temp = explode('?', $v);
- $v = $temp[0];
- parse_str($temp[1], $data);
- self::$data = array_merge($data, self::$data);
- }
- self::$data['l'] = $v;
- }
- }
- }
- }
- }
- protected static function filter(&$data)
- {
- if ($data) {
- foreach ($data as $k => $v) {
- if (is_array($v)) {
- self::filter($v);
- } else {
- if ($data[$k] == 'undefined') {
- $data[$k] = '';
- } else {
- $data[$k] = htmlspecialchars($v);
- }
- }
- }
- }
- }
- }
|