public function detectLanguage() { $input = Input::getInstance('SERVER'); //strstr()需要PHP5.3.0以上版本支持第三个参数,如果找不到,返回false $language = strstr($input->get('LANG', ''), '.', true); if (empty($language)) { $accept = $input->get('HTTP_ACCEPT_LANGUAGE', ''); preg_match_all('/([a-z]{2}\\-?[A-Z]{0,2})/', $accept, $matches); foreach ($matches[0] as $language) { $language = str_replace('-', '_', $language); if (file_exists($this->locale_dir . '/' . $language)) { break; } } } return $language; }
/** * 寻找与网址匹配的handler和filters * 使用贪婪匹配,子目录中的路由器优先,长的路由项优先 * 没有找到匹配项时,返回空数组,否则返回数组中含有以下元素 * handler 控制器 filters 过滤器数组 url 网址 args 占位符对应值数组 * * @param string $path * 要查找的网址 * @param bool $is_sorted * 是否已经逆序排列过 * @return array */ public function dispatch($path, $is_sorted = false) { $path = rtrim(strtolower($path), ' /') . '/'; // 先寻找匹配的路由器 if (!$is_sorted) { krsort($this->children); // 贪婪匹配,需要逆向排序 } foreach ($this->children as $prefix => $filename) { if (starts_with($path, $prefix)) { $router = new self($filename, $prefix); $path = substr($path, strlen($prefix)); return $router->dispatch($path); } } // 再寻找匹配的路由项 if (!$is_sorted) { krsort($this->items); // 贪婪匹配,需要逆向排序 } foreach ($this->items as $rule => $handlers) { if (preg_match($rule, $path, $args) === 1) { // 第一项为匹配的网址 $url = $this->prefix . array_shift($args); return ['method' => Input::getMethod(), 'handlers' => &$handlers, 'args' => $args, 'url' => $url, 'rule' => $rule]; } } $this->abort(404); // 没有找到匹配项,输出HTTP 404 return ['method' => 'except', 'handlers' => [], 'args' => []]; }