Пример #1
0
 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;
 }
Пример #2
0
 /**
  * 寻找与网址匹配的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' => []];
 }