protected function buildRouteCache() { $files = \think\Config::get('route_config_file'); foreach ($files as $file) { if (is_file(CONF_PATH . $file . CONF_EXT)) { $config = (include CONF_PATH . $file . CONF_EXT); if (is_array($config)) { \think\Route::import($config); } } } $rules = \think\Route::rules(true); array_walk_recursive($rules, [$this, 'buildClosure']); $content = '<?php ' . PHP_EOL . 'return '; $content .= var_export($rules, true) . ';'; $content = str_replace(['\'[__start__', '__end__]\''], '', stripcslashes($content)); return $content; }
public function testDomain() { $request = Request::create('http://subdomain.thinkphp.cn'); Route::domain('subdomain.thinkphp.cn', 'sub?abc=test&status=1'); $rules = Route::rules('GET'); Route::checkDomain($request, $rules); $this->assertEquals('sub', Route::getbind('module')); $this->assertEquals('test', $_GET['abc']); $this->assertEquals(1, $_GET['status']); Route::domain('subdomain.thinkphp.cn', '\\app\\index\\controller'); $rules = Route::rules('GET'); Route::checkDomain($request, $rules); $this->assertEquals('\\app\\index\\controller', Route::getbind('namespace')); Route::domain(['subdomain.thinkphp.cn' => '@\\app\\index\\controller\\blog']); $rules = Route::rules('GET'); Route::checkDomain($request, $rules); $this->assertEquals('\\app\\index\\controller\\blog', Route::getbind('class')); }
private static function getRouteAlias() { if ($item = Cache::get('think_route_map')) { return $item; } // 获取路由定义 $array = Route::rules(); foreach ($array as $type => $rules) { foreach ($rules as $rule => $val) { if (true === $val || empty($val['rule'])) { continue; } $route = $val['route']; $vars = $val['var']; if (is_array($val['rule'])) { foreach ($val['rule'] as $val) { $key = $val['rule']; $route = $val['route']; $var = $val['var']; $param = []; if (is_array($route)) { $route = implode('\\', $route); } elseif ($route instanceof \Closure) { continue; } elseif (strpos($route, '?')) { list($route, $str) = explode('?', $route, 2); parse_str($str, $param); } $var = array_merge($vars, $var); $item[$route][] = [$rule . '/' . $key, $var, $param]; } } else { $param = []; if (is_array($route)) { $route = implode('\\', $route); } elseif ($route instanceof \Closure) { continue; } elseif (strpos($route, '?')) { list($route, $str) = explode('?', $route, 2); parse_str($str, $param); } $item[$route][] = [$rule, $vars, $param]; } } } // 检测路由别名 $alias = Route::rules('alias'); foreach ($alias as $rule => $route) { $route = is_array($route) ? $route[0] : $route; $item[$route][] = [$rule, [], []]; } !App::$debug && Cache::set('think_route_map', $item); return $item; }
public function setUp() { Route::rules([]); Route::name([]); }
protected static function parseDomain(&$url, $domain) { if (!$domain) { return ''; } $request = Request::instance(); if (true === $domain) { // 自动判断域名 $domain = $request->host(); if (Config::get('url_domain_deploy')) { // 根域名 $urlDomainRoot = Config::get('url_domain_root'); $domains = Route::rules('domain'); $route_domain = array_keys($domains); foreach ($route_domain as $domain_prefix) { if (0 === strpos($domain_prefix, '*.') && strpos($domain, ltrim($domain_prefix, '*.')) !== false) { foreach ($domains as $key => $rule) { $rule = is_array($rule) ? $rule[0] : $rule; if (is_string($rule) && false === strpos($key, '*') && 0 === strpos($url, $rule)) { $url = ltrim($url, $rule); $domain = $key; // 生成对应子域名 if (!empty($urlDomainRoot)) { $domain .= $urlDomainRoot; } break; } else { if (false !== strpos($key, '*')) { if (!empty($urlDomainRoot)) { $domain .= $urlDomainRoot; } break; } } } } } } } elseif (!strpos($domain, '.')) { $rootDomain = Config::get('url_domain_root'); if (empty($rootDomain)) { $host = $request->host(); $rootDomain = substr_count($host, '.') > 1 ? substr(strstr($host, '.'), 1) : $host; } $domain .= '.' . $rootDomain; } return ($request->isSsl() ? 'https://' : 'http://') . $domain; }
public function setUp() { Route::rules(['GET' => [], 'POST' => [], 'PUT' => [], 'DELETE' => [], 'PATCH' => [], 'HEAD' => [], 'OPTIONS' => [], '*' => [], 'alias' => [], 'domain' => [], 'pattern' => [], 'name' => []]); Route::name([]); }
/** * URL路由检测(根据PATH_INFO) * @access public * @param \think\Request $request * @param array $config * @return array * @throws \think\Exception */ public static function routeCheck($request, array $config) { $path = $request->path(); $depr = $config['pathinfo_depr']; $result = false; // 路由检测 $check = !is_null(self::$routeCheck) ? self::$routeCheck : $config['url_route_on']; if ($check) { // 开启路由 if (is_file(RUNTIME_PATH . 'route.php')) { // 读取路由缓存 $rules = (include RUNTIME_PATH . 'route.php'); if (is_array($rules)) { Route::rules($rules); } } else { $files = $config['route_config_file']; foreach ($files as $file) { if (is_file(CONF_PATH . $file . CONF_EXT)) { // 导入路由配置 $rules = (include CONF_PATH . $file . CONF_EXT); if (is_array($rules)) { Route::import($rules); } } } } // 路由检测(根据路由定义返回不同的URL调度) $result = Route::check($request, $path, $depr, $config['url_domain_deploy']); $must = !is_null(self::$routeMust) ? self::$routeMust : $config['url_route_must']; if ($must && false === $result) { // 路由无效 throw new RouteNotFoundException(); } } if (false === $result) { // 路由无效 解析模块/控制器/操作/参数... 支持控制器自动搜索 $result = Route::parseUrl($path, $depr, $config['controller_auto_search']); } return $result; }