入口文件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;
}