shopnc是国内比较成熟的一套b2b2c系统。我们也开发过自己的一套b2b2c系统,但是相比较了下,确实有不少的差距。
一般在初期我们只会用到目录里的shop文件夹。(访问默认的首页)
$site_url = strtolower('http://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/index.php')).'/shop/index.php');
include('shop/index.php');
会自动跳转到shop/index.php里面去。
每个项目都会有对应index.php(比如cms,mobile等项目里面)用来定义各个项目的属性。(该文件主要加载一些内置文件和资源)
同时运行核心函数方法:Base::Run()
public static function run(){
self::cp();
self::init();
self::control();
}
该方法是一个静态方法(该Base类也是一个final类,对于确定了没有继承的类,用final继承类可以提升运行效率,输出确定的方法)
在run的方法中,运行了Base自身类的cp,init,control方法cp主要是用来限定确定的host访问的
private static function cp(){
if (self::CPURL == '') return;
if ($_SERVER['HTTP_HOST'] == 'localhost') return;
if ($_SERVER['HTTP_HOST'] == '127.0.0.1') return;
if (strpos(self::CPURL,'||') !== false){
$a = explode('||',self::CPURL);
foreach ($a as $v) {
$d = strtolower(stristr($_SERVER['HTTP_HOST'],$v));
if ($d == strtolower($v)){
return;
}else{
continue;
}
}
header('location: http://www.test.com');exit();
}else{
$d = strtolower(stristr($_SERVER['HTTP_HOST'],self::CPURL));
if ($d != strtolower(self::CPURL)){
header('location: http://www.test.com');exit();
}
}
}
该方法分析:从程序结构上,感觉没有什么作用,校验是不是指定的网址。但是对于授权的域名网址却非常有用,起初我一直没有明白这个方法做什么用的,以为是为了防止CSRF攻击,但是csrf攻击本身还是调用了对应的URL,无法进行避免。但是对于加密授权作用却非常大。假如该套程序授权给了www.test.com,www.test1.com俩个域名使用,同时把Base文件进行加密处理,然后为其配置对应的文件。正常情况下,系统是可以运行的,但是只有该域名可以正常运行(这就是程序绑定运行域名的逻辑)。
初始化方法,一般系统的初始化方法都差不多,主要初始化对应参数配置(该配置可以通过当前的项目定义进行获取,同时开启session)还有一些语言配置。
核心方法control
private static function control(){
//二级域名
if ($GLOBALS['setting_config']['enabled_subdomain'] == '1' && $_GET['act'] == 'index' && $_GET['op'] == 'index'){
$store_id = subdomain();
if ($store_id > 0) $_GET['act'] = 'show_store';
}
$act_file = realpath(BASE_PATH.'/control/'.$_GET['act'].'.php');
$class_name = $_GET['act'].'Control';
if (!@include($act_file)){
if (C('debug')) {
throw_exception("Base Error: access file isn't exists!");
} else {
showMessage('抱歉!您访问的页面不存在','','html','error');
}
}
if (class_exists($class_name)){
$main = new $class_name();
$function = $_GET['op'].'Op';
if (method_exists($main,$function)){
$main->$function();
}elseif (method_exists($main,'indexOp')){
$main->indexOp();
}else {
$error = "Base Error: function $function not in $class_name!";
throw_exception($error);
}
}else {
$error = "Base Error: class $class_name isn't exists!";
throw_exception($error);
}
}
该方法的总结:该方法根据url传递的act和op找到对应默认的class和操作方法(这种自动加载实例化的方法和最简单的mvc结构里设置的其实思路是一样的)。采用了自动加载类Base::autoload.
小结:
用了一个访问域名运行检测,做授权认证。全局变量参数控制载入不同的配置,生成不同的网站。(一个大系统架设多个网站系统的思路,这样可以公用相同部分的配置)。用final确定基类不允许继承(同时有助于加密)。自动加载设定好加载对应项目的控制器,通过外部访问act和op的方式访问不同的方法,通用框架类的自动加载方法。
转载于:https://my.oschina.net/xiongyuanliang/blog/549467