Example #1
0
 public static function run($config)
 {
     // load the config
     self::$config = $config;
     //initialize the basic variables
     self::init();
     //parse route
     $router = new Core_Route($config['system']['route']['url_type']);
     $router_params = $router->parse_route();
     //diatribute the request
     self::route_distribute($router_params, $config);
 }
Example #2
0
 /**
  * 根据路径信息获取路由配置
  * @param string $pathinfo
  */
 public function get($pathinfo)
 {
     if (!isset(Core_Route::$regex[Core::$project][Core::$project])) {
         # 构造路由正则
         $this->_comp();
     }
     foreach (Core_Route::$regex[Core::$project] as $k => $v) {
         if (isset(Core_Route::$route[$k]['for'])) {
             if (Core_Route::$route[$k]['for'] != Core::$project_url) {
                 # 如果路由不是为当前url设置的则或略
                 continue;
             }
         }
         $preg = Core_Route::_matches($pathinfo, $k);
         if ($preg) {
             Core_Route::$last_route = $k;
             return $preg;
         }
     }
     return false;
 }
Example #3
0
 /**
  * Creates an html list of all classes sorted by category (or package if no category)<br>
  * [aaa](http://www.baid.com)
  * asdf
  *
  * @return   string   the html for the menu
  */
 public static function menu()
 {
     $classes = Docs::classes();
     foreach ($classes as $class) {
         if (isset($classes['kohana_' . $class])) {
             // Remove extended classes
             unset($classes['kohana_' . $class]);
         }
     }
     ksort($classes);
     $menu = array();
     $route = Core_Route::get('docs/api');
     foreach ($classes as $class) {
         $class = Docs_Class::factory($class);
         // Test if we should show this class
         if (!Docs::show_class($class)) {
             continue;
         }
         $link = HTML::anchor($route->uri(array('class' => $class->class->name)), $class->class->name);
         if (isset($class->tags['package'])) {
             foreach ($class->tags['package'] as $package) {
                 if (isset($class->tags['category'])) {
                     foreach ($class->tags['category'] as $category) {
                         $menu[$package][$category][] = $link;
                     }
                 } else {
                     $menu[$package]['Base'][] = $link;
                 }
             }
         } else {
             $menu['[Unknown]']['Base'][] = $link;
         }
     }
     // Sort the packages
     ksort($menu);
     return View::factory('userguide/api/menu')->bind('menu', $menu);
 }
Example #4
0
 /**
  * 执行请求,并将输出结果返回
  *
  * @param string $path_info 路径信息
  * @param boolean $print 是否直接输出
  * @param boolean $use_route 是否尝试在路由中搜索
  * @param boolean $is_internal 是否内部调用,默认:否
  * @param string $controller_dir 指定控制器目录,命令行下默认为shell,网站运行为controllers
  * @return string
  */
 public static function execute($uri, $print = true, $use_route = true, $is_internal = false, $controller_dir = null)
 {
     $ob_open = false;
     if (!$print && !IS_CLI) {
         ob_start();
         $ob_open = true;
     }
     $params = false;
     # 路由设置
     if (IS_CLI != true && true === $use_route && Core::$project_config['route'] && ($route = Core::route()->get($uri))) {
         $params = $route;
         # 默认控制器
         if ($params['controller']) {
             $params['controller'] = str_replace('/', '_', $params['controller']);
         } else {
             $params['controller'] = Core::$project_config['default_controller'];
         }
         $dir = 'controllers';
         if (IS_SYSTEM_MODE) {
             $file = '[system]/' . $params['controller'];
         } elseif (IS_CLI) {
             $file = '[shell]/' . $params['controller'];
         } elseif (Core::$is_admin_url) {
             $file = '[admin]/' . $params['controller'];
         } else {
             $file = $params['controller'];
         }
         if ($controller_dir && preg_match('#^[a-zA-Z0-9_]+$#', $controller_dir)) {
             $dir = $controller_dir;
             $file = strtolower(str_replace('__', '/', $file));
         }
         if (!Core::find_file($dir, $file, null, true)) {
             Core::debug()->error('没有找到控制器:' . $params['controller']);
             if ($ob_open) {
                 ob_end_clean();
             }
             return false;
         }
         $is_use_route = true;
         if (Core_Route::$last_route) {
             Core_Route::$current_route = Core_Route::$last_route;
             Core_Route::$route_list[] = Core_Route::$current_route;
         }
     } else {
         $params = HttpIO::find_controller($uri, $controller_dir, $is_internal);
         if (!IS_CLI && null === HttpIO::$uri && HttpIO::METHOD == 'GET' && !$is_internal && isset($params['need_redirect']) && $params['need_redirect'] == true) {
             # 页面结尾自动加/
             $request = explode('?', $_SERVER['REQUEST_URI'], 2);
             Core::close_buffers(false);
             HttpIO::redirect($request[0] . '/' . (isset($request[1]) ? '?' . $request[1] : ''), 301);
             exit;
         }
         $is_use_route = false;
     }
     if (false === $params) {
         Core::debug()->error('没有找到指定页面');
         if ($ob_open) {
             ob_end_clean();
         }
         return false;
     }
     # 初始化$uri
     if (null === HttpIO::$uri) {
         HttpIO::$uri = $uri;
     }
     if (null === HttpIO::$params) {
         HttpIO::$params = $params;
     }
     # 控制器名称
     $controller_name = 'Controller_' . $params['controller'];
     # 参数
     $arguments = isset($params['arguments']) ? $params['arguments'] : array();
     if (IS_SYSTEM_MODE) {
         $params['arguments'] = @unserialize(HttpIO::POST('data', HttpIO::PARAM_TYPE_OLDDATA));
     }
     if ($is_internal) {
         $prefix = 'sub_action';
     } else {
         $prefix = 'action';
     }
     # 方法
     $action_name = $params['action'];
     if (!$action_name) {
         $action_name = $prefix . '_' . Core::$project_config['default_action'];
     } else {
         $action_name = $prefix . '_' . $action_name;
     }
     # 如果不存在控制器类则抛404页面
     if (!class_exists($controller_name, false)) {
         Core::debug()->error('控制器:' . $controller_name . '不存在。');
         if ($ob_open) {
             ob_end_clean();
         }
         return false;
     }
     # 构造新控制器
     if (!isset(HttpIO::$controlers[$controller_name])) {
         HttpIO::$controlers[$controller_name] = new $controller_name();
     }
     $old_current_controller = HttpIO::$current_controller;
     HttpIO::$current_controller = $controller = HttpIO::$controlers[$controller_name];
     # 存控制器的数据
     static $obj_params = array();
     if (!isset($obj_params[$controller_name]) || !is_array($obj_params[$controller_name])) {
         $obj_params[$controller_name] = array();
     }
     if (method_exists($controller, '_callback_get_vars')) {
         # 将控制器参数记录下来
         $obj_params[$controller_name][] = $controller->_callback_get_vars();
     }
     if (method_exists($controller, '_callback_set_vars')) {
         # 将参数传递给控制器
         $controller->_callback_set_vars($params);
     }
     if (!$is_internal && !method_exists($controller, $action_name)) {
         $action_name = $prefix . '_default';
         if (!method_exists($controller, $action_name)) {
             $action_name = '__call';
             $arguments = array($action_name, $arguments);
             if (!method_exists($controller, $action_name)) {
                 Core::debug()->error('控制器:' . $controller_name . '方法:' . $action_name . '不存在。');
                 if ($ob_open) {
                     ob_end_clean();
                 }
                 return false;
             }
         }
     }
     # Method is Public?
     $ispublicmethod = new ReflectionMethod($controller, $action_name);
     if (!$ispublicmethod->isPublic()) {
         Core::debug()->error('控制器:' . $controller_name . '方法:' . $action_name . '受保护。');
         if ($ob_open) {
             ob_end_clean();
         }
         return false;
     }
     if (!$is_internal) {
         if (method_exists($controller, 'before')) {
             $controller->before();
         }
     }
     # 执行方法
     $count_arguments = count($arguments);
     switch ($count_arguments) {
         case 0:
             $controller->{$action_name}();
             break;
         case 1:
             $controller->{$action_name}($arguments[0]);
             break;
         case 2:
             $controller->{$action_name}($arguments[0], $arguments[1]);
             break;
         case 3:
             $controller->{$action_name}($arguments[0], $arguments[1], $arguments[2]);
             break;
         case 4:
             $controller->{$action_name}($arguments[0], $arguments[1], $arguments[2], $arguments[3]);
             break;
         default:
             # Resort to using call_user_func_array for many segments
             call_user_func_array(array($controller, $action_name), $arguments);
             break;
     }
     if (!$is_internal) {
         if (method_exists($controller, 'after')) {
             $controller->after();
         }
     }
     # 将原来的数据重新设置回去
     if (method_exists($controller, '_callback_set_vars')) {
         if (is_array($obj_params[$controller_name])) {
             $tmp_params = array_pop($obj_params[$controller_name]);
             $controller->_callback_set_vars($tmp_params);
         }
     }
     HttpIO::$current_controller = $old_current_controller;
     unset($old_current_controller);
     unset($controller);
     if (!count($obj_params[$controller_name])) {
         unset(HttpIO::$controlers[$controller_name]);
     }
     if (true == $is_use_route) {
         # 路由列队
         array_pop(Core_Route::$route_list);
         if (Core_Route::$route_list) {
             end(Core_Route::$route_list);
             $key = key(Core_Route::$route_list);
             Core_Route::$last_route = Core_Route::$current_route = Core_Route::$route_list[$key];
         } else {
             Core_Route::$route_list = null;
         }
     }
     if (!$print && !IS_CLI) {
         $output = ob_get_clean();
         return $output;
     } else {
         if ($ob_open) {
             ob_end_clean();
         }
         return '';
     }
 }