static function default_dispatcher() { if (Input::$AJAX && Input::$AJAX['widget']) { $widget = Widget::factory(Input::$AJAX['widget']); $method = 'on_' . (Input::$AJAX['object'] ?: 'unknown') . '_' . (Input::$AJAX['event'] ?: 'unknown'); if (method_exists($widget, $method)) { Event::bind('system.output', 'Output::AJAX'); $widget->{$method}(); } return; } $args = Input::args(); $default_page = Config::get('system.default_page'); if (!$default_page) { $default_page = 'index'; } //从末端开始尝试 /* home/page/edit.1 home/page/index.php Index_Controller::edit(1) home/page/index.php Index_Controller::index('edit', 1) home/page.php Page_Controller::edit(1) home/page.php Page_Controller::index('edit', 1) */ $file = end($args); if (!preg_match('/[^\\\\]\\./', $file)) { //有非法字符的只能是参数 $path = implode('/', $args); // home/page/edit/index => index, NULL $candidates[($path ? $path . '/' : '') . $default_page] = array($default_page, NULL); $candidates[$path] = array($file, NULL); // home/page/edit => edit, NULL } if ($args) { $params = array_pop($args); $file = $args ? end($args) : $default_page; $path = $args ? implode('/', $args) : $default_page; $candidates[$path] = array($file, $params); // home/page.php => page, edit|1 } else { $candidates[$default_page] = array($default_page, NULL); } $class = NULL; foreach ($candidates as $path => $candidate) { if (Core::load(CONTROLLER_BASE, $path)) { $class = str_replace('/', '_', $path); $params = array(); if (preg_match_all('/(.*?[^\\\\])\\./', $candidate[1] . '.', $parts)) { foreach ($parts[1] as $part) { $params[] = strtr($part, array('\\.' => '.')); } } Config::set('system.controller_path', $path); Config::set('system.controller_class', $class); break; } } if (!$class) { URI::redirect('error/404'); } if (Input::$AJAX) { $class .= AJAX_SUFFIX; if (!class_exists($class, false)) { Core::load(CONTROLLER_BASE, 'ajax'); $class = 'AJAX' . CONTROLLER_SUFFIX; } $controller = new $class(); $object = Input::$AJAX['object']; $event = Input::$AJAX['event']; $method = $params[0]; if (!$method || $method[0] == '_') { $method = 'index_'; } $method .= '_' . ($object ? $object . '_' : '') . $event; if (method_exists($controller, $method)) { array_shift($params); } else { $method = 'index_' . ($object ? $object . '_' : '') . $event; if (!method_exists($controller, $method)) { $method = NULL; } } if ($method) { Controller::$CURRENT = $controller; Config::set('system.controller_method', $method); Config::set('system.controller_params', $params); $controller->_before_call($method, $params); call_user_func_array(array($controller, $method), $params); $controller->_after_call($method, $params); } } else { $class .= CONTROLLER_SUFFIX; $controller = new $class(); $method = $params[0]; if ($method && $method[0] != '_' && method_exists($controller, $method)) { array_shift($params); } elseif ($method && $method[0] != '_' && method_exists($controller, 'do_' . $method)) { $method = 'do_' . $method; array_shift($params); } else { $method = 'index'; } Controller::$CURRENT = $controller; Config::set('system.controller_method', $method); Config::set('system.controller_params', $params); $controller->_before_call($method, $params); call_user_func_array(array($controller, $method), $params); $controller->_after_call($method, $params); } }