入口文件index.php。
1. 首先获取应用配置文件:
$app_config = require(dirname(__FILE__) . '/config/boot.php');
2. 根据$app_config中 QEEPHP_DIR的设置 从对应的目录中加载QEEPHP主文件Q.php
require $app_config['QEEPHP_DIR'] . '/library/q.php';
3. 根据$app_config中 APP_DIR的设置 从设置的目录中加载应用主文件myapp.php
require $app_config['APP_DIR'] . '/myapp.php';
4.通过调用myapp.php中的类MyApp的静态方法instance 从而获得一个唯一的MyApp的实例。通过获得的实例来执行dispatching方法。dispatching方法在整个流程中是最关键的。在这里根据上下文运行时的状况,来调配各个功能模块,并最终输出结果返回给客户端。
$ret = MyApp::instance($app_config)->dispatching();
dispatching方法:
function dispatching(array $args = array()) { // 构造运行时上下文对象 $context = QContext::instance(); // 获得请求对应的 UDI(统一目的地信息) $udi = $context->requestUDI('array'); #IFDEF DEBUG QLog::log('REQUEST UDI: ' . $context->UDIString($udi), QLog::DEBUG); #ENDIF // 检查是否有权限访问 if (!$this->authorizedUDI($this->currentUserRoles(), $udi) || !$this->authorizedDIY($this->currentUser(),$udi)) { // 拒绝访问 $response = $this->_on_access_denied(); } else { // 确定控制器的类名称 // 控制器类名称 = 模块名_Controller_名字空间_控制器名 $module_name = $udi[QContext::UDI_MODULE]; if ($module_name != QContext::UDI_DEFAULT_MODULE && $module_name) { $dir = "{$this->_app_config['MODULE_DIR']}/{$module_name}/controller"; $class_name = "{$module_name}_controller_"; } else { $dir = "{$this->_app_config['APP_DIR']}/controller"; $class_name = 'controller_'; } $namespace = $udi[QContext::UDI_NAMESPACE]; if ($namespace != QContext::UDI_DEFAULT_NAMESPACE && $namespace) { $class_name .= "{$namespace}_"; $dir .= "/{$namespace}"; } $controller_name = $udi[QContext::UDI_CONTROLLER]; $class_name .= $controller_name; $filename = "{$controller_name}_controller.php"; do { // 载入控制器文件 try { if (!class_exists($class_name, false)) { Q::loadClassFile($filename, array($dir), $class_name); } } catch (Q_ClassNotDefinedException $ex) { $response = $this->_on_action_not_defined(); break; } catch (Q_FileNotFoundException $ex) { $response = $this->_on_action_not_defined(); break; } // 构造控制器对象 $controller = new $class_name($this); $action_name = $udi[QContext::UDI_ACTION]; if ($controller->existsAction($action_name)) { // 如果指定动作存在,则调用 $response = $controller->execute($action_name, $args); } else { // 如果指定动作不存在,则尝试调用控制器的 _on_action_not_defined() 函数处理错误 $response = $controller->_on_action_not_defined($action_name); if (is_null($response)) { // 如果控制器的 _on_action_not_defined() 函数没有返回处理结果 // 则由应用程序对象的 _on_action_not_defined() 函数处理 $response = $this->_on_action_not_defined(); } } } while (false); } if (is_object($response) && method_exists($response, 'execute')) { // 如果返回结果是一个对象,并且该对象有 execute() 方法,则调用 $response = $response->execute(); } elseif ($response instanceof QController_Forward) { // 如果是一个 QController_Forward 对象,则将请求进行转发 $response = $this->dispatching($response->args); } // 其他情况则返回执行结果 return $response; }