文件组织方式
- 核心框架与应用相分离,每个应用都有自己的入口文件index.php,位于应用目录下。
- 将公用资源,配置文件,上传目录,model,日志,缓存放在根目录下的数据文件夹中;
- 网站根目录下文件夹有三类,分别是:应用、核心框架、数据文件夹;
- 网站根目录下的index.php仅用于跳转到默认应用@header('Location: '.$site_url);
- 网站根目录下有global.php,被每个入口文件调用,用于变量初始化
PHPMVC框架定义的变量
APP_ID 用于定义当前的应用key,如商铺系统,定义shop
BASE_PATH 应用的路径
BASE_ROOT_PATH 网站根目录路径
BASE_CORE_PATH 指向核心框架目录
BASE_DATA_PATH 指向数据文件夹目录
define('DS','/');
define('InShop',true);
define('StartTime',microtime(true));
define('TIMESTAMP',time());
define('DIR_SHOP','shop');
define('DIR_CMS','cms');
define('DIR_CIRCLE','circle');
define('DIR_MICROSHOP','microshop');
define('DIR_ADMIN','admin');
define('DIR_API','api');
define('DIR_MOBILE','mobile');
define('DIR_WAP','wap');
define('DIR_RESOURCE','data/resource');
define('DIR_UPLOAD','data/upload');
define('ATTACH_PATH','shop');
define('ATTACH_COMMON','shop/common');
define('ATTACH_AVATAR','shop/avatar');
define('ATTACH_EDITOR','shop/editor');
define('ATTACH_MEMBERTAG','shop/membertag');
define('ATTACH_STORE','shop/store');
define('ATTACH_GOODS','shop/store/goods');
define('ATTACH_LOGIN','shop/login');
define('ATTACH_ARTICLE','shop/article');
define('ATTACH_BRAND','shop/brand');
define('ATTACH_ADV','shop/adv');
define('ATTACH_ACTIVITY','shop/activity');
define('ATTACH_WATERMARK','shop/watermark');
define('ATTACH_POINTPROD','shop/pointprod');
define('ATTACH_GROUPBUY','shop/groupbuy');
define('ATTACH_SLIDE','shop/store/slide');
define('ATTACH_VOUCHER','shop/voucher');
define('ATTACH_STORE_JOININ','shop/store_joinin');
define('ATTACH_REC_POSITION','shop/rec_position');
define('ATTACH_MOBILE','mobile');
define('ATTACH_CIRCLE','circle');
define('ATTACH_CMS','cms');
define('ATTACH_MALBUM','shop/member');
define('ATTACH_MICROSHOP','microshop');
define('TPL_SHOP_NAME','default');
define('TPL_CIRCLE_NAME', 'default');
define('TPL_MICROSHOP_NAME', 'default');
define('TPL_CMS_NAME', 'default');
define('TPL_ADMIN_NAME', 'default');
//商家入驻状态定义
//新申请
define('STORE_JOIN_STATE_NEW', 10);
//完成付款
define('STORE_JOIN_STATE_PAY', 11);
//初审成功
define('STORE_JOIN_STATE_VERIFY_SUCCESS', 20);
//初审失败
define('STORE_JOIN_STATE_VERIFY_FAIL', 30);
//付款审核失败
define('STORE_JOIN_STATE_PAY_FAIL', 31);
//开店成功
define('STORE_JOIN_STATE_FINAL', 40);
//默认颜色规格id(前台显示图片的规格)
define('DEFAULT_SPEC_COLOR_ID', 1);
//商品图片
define('GOODS_IMAGES_WIDTH', '60,240,360,1280');
define('GOODS_IMAGES_HEIGHT', '60,240,360,12800');
define('GOODS_IMAGES_EXT', '_60,_240,_360,_1280');
//订单状态
//已取消
define('ORDER_STATE_CANCEL', 0);
//已产生但未支付
define('ORDER_STATE_NEW', 10);
//已支付
define('ORDER_STATE_PAY', 20);
//已发货
define('ORDER_STATE_SEND', 30);
//已收货,交易成功
define('ORDER_STATE_SUCCESS', 40);
//订单结束后可评论时间,15天,60*60*24*15
define('ORDER_EVALUATE_TIME', 1296000);
主框架定义的常量
define('DEFAULT_PLATFORM_STORE_ID', $config['default_store_id']);
define('URL_MODEL',$config['url_model']);
define(SUBDOMAIN_SUFFIX, $config['subdomain_suffix']);
define('SHOP_SITE_URL', $config['shop_site_url']);
define('CMS_SITE_URL', $config['cms_site_url']);
define('CIRCLE_SITE_URL', $config['circle_site_url']);
define('MICROSHOP_SITE_URL', $config['microshop_site_url']);
define('ADMIN_SITE_URL', $config['admin_site_url']);
define('MOBILE_SITE_URL', $config['mobile_site_url']);
define('WAP_SITE_URL', $config['wap_site_url']);
define('UPLOAD_SITE_URL',$config['upload_site_url']);
define('RESOURCE_SITE_URL',$config['resource_site_url']);
define('BASE_DATA_PATH',BASE_ROOT_PATH.'/data');
define('BASE_UPLOAD_PATH',BASE_DATA_PATH.'/upload');
define('BASE_RESOURCE_PATH',BASE_DATA_PATH.'/resource');
define('CHARSET',$config['db'][1]['dbcharset']);
define('DBDRIVER',$config['dbdriver']);
define('SESSION_EXPIRE',$config['session_expire']);
define('LANG_TYPE',$config['lang_type']);
define('COOKIE_PRE',$config['cookie_pre']);
define('DBPRE',($config['db'][1]['dbname']).'`.`'.($config['tablepre']));
PHPMVC框架执行流程
- 定义APP_ID
- 定义应用路径 BASE_PATH
- 包含网站根目录下的global.php文件include(dirname(dirname(__FILE__)).'/global.php'),global.php文件流程参考流程3-1。
- 加载控制器基类include(BASE_PATH.'/control/control.php')
- 加载框架的核心文件include(BASE_CORE_PATH.'/shopml.php'),shopml.php文件流程参考流程5-1
- Base::run();参考流程6-1
流程3-1
- 判断是否需要安装
- 初始化并定义路径
- 记录脚本开始执行的时间
- 定义各个应用的文件夹名称
流程5-1
- 加载配置文件config.ini.php;
- 如果应用文件夹下config目录中也有config.ini.php配置文件,同样进行加载;并将配置信息定义为常量;
- 如果act和op是post而不是get,则变成get并小写。
- 如果act为空,加载route类并运行;require_once(BASE_CORE_PATH.'/framework/core/route.php');
- act和op的再次过滤,不合规则发配到index;
- 对GET POST接收内容进行过滤,$ignore内的下标不被过滤;
- 是否启用zip压缩
- require_once(BASE_CORE_PATH.'/framework/function/core.php'); 该文件中存放公用函数,例如Model等函数均在此文件中。
- require_once(BASE_CORE_PATH.'/framework/core/base.php');
- require_once(BASE_CORE_PATH.'/framework/function/goods.php');
- 自动装入对象spl_autoload_register(array('Base', 'autoload'));
流程6-1
- 合法性验证function cp()
- 初始化init()
- 执行对应的控制器function control()
核心框架文件解释
核心框架文件均集中在core\framework下:
- cache各种缓存类,均继承与core\framework\libraries\cache.php下的Cache类。分别用于apc、eaccelerator、file、memcache、redis、xcache的缓存;
- core下有两个文件,base.php用于启动整个框架,route.php用于url路由;
- db,数据库驱动,当前包含mysql驱动和mysqli驱动;
- function,公用函数文件,包括图片处理函数、ftp函数等等;
- libraries,各种类库
一些需要解释的问题
系统中很多直接调用的函数都是位于文件require_once(BASE_CORE_PATH.'/framework/function/core.php'); 中的。例如Model,import等。
在该系统中,调用类库直接调用即可,例如$upload = new UploadFile();,Tpl::showpage('cut','null_layout');等等,之所以能够实现这一功能,是依靠下面这几句实现的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//这些代码负责将Base类中的autoload方法注册成为一个自动装载器
if(function_exists('spl_autoload_register')) {
??? spl_autoload_register(array('Base', 'autoload'));
} else {
??? function __autoload($class) {
??????? return Base::autoload($class);
??? }
}
//autoload函数如下
public static function autoload($class){
??? $class = strtolower($class);
??? if (ucwords(substr($class,-5)) == 'Class' ){
??????? if (!@include_once(BASE_PATH.'/framework/libraries/'.substr($class,0,-5).'.class.php')){
??????????? exit("Class Error: {$class}.isn't exists!");
??????? }
??? }elseif (ucwords(substr($class,0,5)) == 'Cache' && $class != 'cache'){
??????? if (!@include_once(BASE_CORE_PATH.'/framework/cache/'.substr($class,0,5).'.'.substr($class,5).'.php')){
??????????? exit("Class Error: {$class}.isn't exists!");
??????? }
??? }elseif ($class == 'db'){
??????? if (!@include_once(BASE_CORE_PATH.'/framework/db/'.strtolower(DBDRIVER).'.php')){
??????????? exit("Class Error: {$class}.isn't exists!");
??????? }
??? }else{
??????? if (!@include_once(BASE_CORE_PATH.'/framework/libraries/'.$class.'.php')){
??????????? exit("Class Error: {$class}.isn't exists!");
??????? }
??? }
}
而对于函数文件的调用则需要import('function.thumb');进行。