首页 > 代码库 > thinkphp 3.2.3 - App.class.php 解析

thinkphp 3.2.3 - App.class.php 解析

 

class App {
    
    public static function init() {
        load_ext_file(COMMON_PATH);
//         {
//             /home/www/www.domain.com/myapp/Common/Common/<LOAD_EXT_FILE,field1>.php
//             /home/www/www.domain.com/myapp/Common/Conf/<LOAD_EXT_CONFIG,config1>.php
//         }
        
        // URL调度
        Dispatcher::dispatch();
//         {
//             //...
//             // 匹配出模块
//             //...
//             // 加载模块配置文件  /home/www/www.domain.com/myapp/Module1/Conf/config.php
//             if(is_file(MODULE_PATH.‘Conf/config‘.CONF_EXT))
//                 C(load_config(MODULE_PATH.‘Conf/config‘.CONF_EXT));
//             // 加载应用模式对应的配置文件
//             if(‘common‘ != APP_MODE && is_file(MODULE_PATH.‘Conf/config_‘.APP_MODE.CONF_EXT))
//                 C(load_config(MODULE_PATH.‘Conf/config_‘.APP_MODE.CONF_EXT));
//             // 当前应用状态对应的配置文件
//             if(APP_STATUS && is_file(MODULE_PATH.‘Conf/‘.APP_STATUS.CONF_EXT))
//                 C(load_config(MODULE_PATH.‘Conf/‘.APP_STATUS.CONF_EXT));
        
//             // 加载模块别名定义  /home/www/www.domain.com/myapp/Module1/Conf/alias.php
//             if(is_file(MODULE_PATH.‘Conf/alias.php‘))
//                 Think::addMap(include MODULE_PATH.‘Conf/alias.php‘);
//             // 加载模块tags文件定义 /home/www/www.domain.com/myapp/Module1/Conf/tags.php
//             if(is_file(MODULE_PATH.‘Conf/tags.php‘))
//                 Hook::import(include MODULE_PATH.‘Conf/tags.php‘);
//             // 加载模块函数文件  /home/www/www.domain.com/myapp/Module1/Conf/function.php
//             if(is_file(MODULE_PATH.‘Common/function.php‘))
//                 include MODULE_PATH.‘Common/function.php‘;
        
//             // 加载模块的扩展配置文件
//             load_ext_file(MODULE_PATH);
// //             {
// //                 /home/www/www.domain.com/myapp/Module1/Common/Common/<LOAD_EXT_FILE,field1>.php
// //                 /home/www/www.domain.com/myapp/Module1/Common/Conf/<LOAD_EXT_CONFIG,config1>.php
// //             }
        
//             // 获取控制器的命名空间(路径)
//             // controller
        
//             // 获取控制器和操作名
//             // action
//         }
        
        Hook::listen(‘url_dispatch‘);
    }
    
    public static function run() {
        // 应用初始化标签
        Hook::listen(‘app_init‘); // 执行执行app_init标记的行为,没有返回值
//         {
//             Behavior\BuildLiteBehavior
//         }
        
        App::init(); // ******* 引入其他文件,解析路由,引入模块中的相关配置  *******
        
        Hook::listen(‘app_begin‘);
//         {
//             Behavior\ReadHtmlCacheBehavior
//         }
        
        // Session初始化
        if(!IS_CLI){
            session(C(‘SESSION_OPTIONS‘));
        }
        
        App::exec(); // ******* 根据解析出来的路由,执行代码 *******
        
        Hook::listen(‘app_end‘);
//         {
//             Behavior\ShowPageTraceBehavior
//         }
    }
    
    public static function exec() {
    
        if(!preg_match(‘/^[A-Za-z](\/|\w)*$/‘,CONTROLLER_NAME)){ // 安全检测
            $module  =  false;
        }elseif(C(‘ACTION_BIND_CLASS‘)){
            // 操作绑定到类:模块\Controller\控制器\操作
            $layer  =   C(‘DEFAULT_C_LAYER‘);
            if(is_dir(MODULE_PATH.$layer.‘/‘.CONTROLLER_NAME)){ // /home/www/www.domain.com/myapp/Module1/Controller/Ctrl1
                $namespace  =   MODULE_NAME.‘\\‘.$layer.‘\\‘.CONTROLLER_NAME.‘\\‘;  // \Module1\Controller\Ctrl1\
            }else{ 
                // 空控制器
                $namespace  =   MODULE_NAME.‘\\‘.$layer.‘\\_empty\\‘;  // \Module1\Controller\_empty\
            }
            $actionName     =   strtolower(ACTION_NAME);
            if(class_exists($namespace.$actionName)){ // \Module1\Controller\Ctrl1\action1
                $class   =  $namespace.$actionName;
            }elseif(class_exists($namespace.‘_empty‘)){  // \Module1\Controller\Ctrl1\_empty
                // 空操作
                $class   =  $namespace.‘_empty‘;
            }else{
                E(L(‘_ERROR_ACTION_‘).‘:‘.ACTION_NAME);
            }
            $module  =  new $class;
            // 操作绑定到类后 固定执行run入口
            $action  =  ‘run‘;
        }else{
            //创建控制器实例
            $module  =  controller(CONTROLLER_NAME,CONTROLLER_PATH); 
//             {
//                 new \Module1\Controller\Ctrl1
//                 new \Addon\$_GET[‘addon‘]\Controller\Ctrl1
//             }
        }
    
        if(!$module) {
            if(‘4e5e5d7364f443e28fbf0d3ae744a59a‘ == CONTROLLER_NAME) {
                header("Content-type:image/png");
                exit(base64_decode(App::logo()));
            }
    
            // 是否定义Empty控制器
            $module = A(‘Empty‘); // EmptyController
            if(!$module){
                E(L(‘_CONTROLLER_NOT_EXIST_‘).‘:‘.CONTROLLER_NAME);
            }
        }
    
        // 获取当前操作名 支持动态路由
        if(!isset($action)){
            $action    =   ACTION_NAME.C(‘ACTION_SUFFIX‘);
        }
        try{
            self::invokeAction($module,$action); // 执行行为方法
        } catch (\ReflectionException $e) {
            // 方法调用发生异常后 引导到__call方法处理
            $method = new \ReflectionMethod($module,‘__call‘); 
            $method->invokeArgs($module,array($action,‘‘));
//             {
//                 EmptyController::__call()
//                 Ctrl1Controller::__call()
//             }
        }
        return ;
    }
}

 

thinkphp 3.2.3 - App.class.php 解析