ECMALL源码阅读二:单一入口模式的实现

ECMALL采用单一入口模式进行项目部署和访问,无论完成什么功能,都有一个统一的入口。 好处是,我们可以一次性的加载基础文件,无须重复Include.
入口主要由2个关键文件组成 index.php 与 ecmall.php,主要完成:

  1. 定义系统相关常量
  2. 载入系统基础文件
  3. 把请求转发到相关APP跟ACTION

载入框架文件(index.php)

<?php
    //载入框架入口文件
	include(ROOT_PATH . '/eccore/ecmall.php');  
	/* 启动ECMall */  
	ECMall::startup(array(  
	//设置路径、变量	
		'default_app'   =>  'default',  
		'default_act'   =>  'index',  
		'app_root'      =>  ROOT_PATH . '/app',  
	//加载系统所需要的基础类  
		'external_libs' =>  array(  
			ROOT_PATH . '/includes/global.lib.php',  
			ROOT_PATH . '/includes/libraries/time.lib.php',  
			ROOT_PATH . '/includes/ecapp.base.php',  
			ROOT_PATH . '/includes/plugin.base.php',  
			ROOT_PATH . '/app/frontend.base.php',
		),  
	)); 
?>

请求转发(ecmall.php)

<?php
class ECMall  
{  
    /* 启动 */  
    function startup($config = array())  
    {  
        /* 加载初始化文件 */  
        require(ROOT_PATH . '/eccore/controller/app.base.php');     //基础控制器类  
        require(ROOT_PATH . '/eccore/model/model.base.php');   //模型基础类  
 
        if (!emptyempty($config['external_libs']))  
        {  
            foreach ($config['external_libs'] as $lib)  
            {  
                require($lib);  
            }  
        }  
        /* 数据过滤 */  
        if (!get_magic_quotes_gpc())  
        {  
            $_GET   = addslashes_deep($_GET);  
            $_POST  = addslashes_deep($_POST);  
            $_COOKIE= addslashes_deep($_COOKIE);  
        }  
  
        /* 获得请求的app与action */  
        $default_app = $config['default_app'] ? $config['default_app'] : 'default';  
        $default_act = $config['default_act'] ? $config['default_act'] : 'index';  
  
        $app    = isset($_REQUEST['app']) ? trim($_REQUEST['app']) : $default_app;  
        $act    = isset($_REQUEST['act']) ? trim($_REQUEST['act']) : $default_act;  
  
        $app_file = $config['app_root'] . "/{$app}.app.php";  
        if (!is_file($app_file))  
        {  
            exit('Missing controller');  
        }
		/* 加载对应的app文件 */
        require($app_file);  
        define('APP', $app);  
        define('ACT', $act);  
        $app_class_name = ucfirst($app) . 'App';  
  
        /* 实例化app控制器 */  
        $app     = new $app_class_name();  
        c($app);  
        $app->do_action($act);        //转发至对应的Action  
        $app->destruct();  
    }  
} 
?>