PHPMVC框架分析

By | 2014年12月11日

文件组织方式

  • 核心框架与应用相分离,每个应用都有自己的入口文件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框架执行流程

  1. 定义APP_ID
  2. 定义应用路径 BASE_PATH
  3. 包含网站根目录下的global.php文件include(dirname(dirname(__FILE__)).'/global.php'),global.php文件流程参考流程3-1。
  4. 加载控制器基类include(BASE_PATH.'/control/control.php')
  5. 加载框架的核心文件include(BASE_CORE_PATH.'/shopml.php'),shopml.php文件流程参考流程5-1
  6. Base::run();参考流程6-1

 

流程3-1

  1. 判断是否需要安装
  2. 初始化并定义路径
  3. 记录脚本开始执行的时间
  4. 定义各个应用的文件夹名称

流程5-1

  1. 加载配置文件config.ini.php;
  2. 如果应用文件夹下config目录中也有config.ini.php配置文件,同样进行加载;并将配置信息定义为常量;
  3. 如果act和op是post而不是get,则变成get并小写。
  4. 如果act为空,加载route类并运行;require_once(BASE_CORE_PATH.'/framework/core/route.php');
  5. act和op的再次过滤,不合规则发配到index;
  6. 对GET POST接收内容进行过滤,$ignore内的下标不被过滤;
  7. 是否启用zip压缩
  8. require_once(BASE_CORE_PATH.'/framework/function/core.php'); 该文件中存放公用函数,例如Model等函数均在此文件中。
  9. require_once(BASE_CORE_PATH.'/framework/core/base.php');
  10. require_once(BASE_CORE_PATH.'/framework/function/goods.php');
  11. 自动装入对象spl_autoload_register(array('Base', 'autoload'));

流程6-1

  1. 合法性验证function cp()
  2. 初始化init()
  3. 执行对应的控制器function control()

 

核心框架文件解释

核心框架文件均集中在core\framework下:

  1. cache各种缓存类,均继承与core\framework\libraries\cache.php下的Cache类。分别用于apc、eaccelerator、file、memcache、redis、xcache的缓存;
  2. core下有两个文件,base.php用于启动整个框架,route.php用于url路由;
  3. db,数据库驱动,当前包含mysql驱动和mysqli驱动;
  4. function,公用函数文件,包括图片处理函数、ftp函数等等;
  5. 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');进行。

发表回复