qeephp框架研究-执行过程简单分析

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

 

你可能感兴趣的:(PHP,框架,Access)