ECMALL源码阅读二:单一入口模式的实现
ECMALL采用单一入口模式进行项目部署和访问,无论完成什么功能,都有一个统一的入口。 好处是,我们可以一次性的加载基础文件,无须重复Include.
入口主要由2个关键文件组成 index.php 与 ecmall.php,主要完成:
- 定义系统相关常量
- 载入系统基础文件
- 把请求转发到相关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();
}
}
?>