ThinkPHP应用模式扩展详解
ThinkPHP的应用模式使得开发人员对核心框架进行改造较以往更为得心应手,并且可以让你的应用适应更多的环境和不同的需求。每个应用模式都有自己的模式定义文件,相对于ThinkPHP3.1版本,ThinkPHP3.2版本对应用模式的扩展更加明确和清晰,在ThinkPHP3.1版本中定义了Cli、Lite、Thin、AMF、PHPRPC、REST模式,其定义方式和ThinkPHP3.2版本的方式大同小异,如有需要可以参考修改,其中Cli模式被ThinkPHP框架内置,不用单独定义Cli模式即可正常使用,如需要更细化调整可以参考3.1版编写的Cli运行模式扩展。ThinkPHP同样提供了便捷的开发环境和正式环境的模式切换方式。让我们随着ThinkPHP的运行流程解析其应用模式扩展之谜。 一、应用模式的使用在研究应用模式扩展之前,看看如何使用应用模式的吧。一般通过在入口文件定义常量APP_MODE为应用模式名称,但是在分析ThinkPHP框架入口文件时,了解到框架默认采用模式为普通模式(common),而且可以自动识别sae环境,当然前提是没有定义APP_MODE常量时,当然ThinkPHP可以自动识别CLI和CGI模式,并且在CLI和CGI环境下运行ThinkPHP框架在默认模式中自动对这两种环境做了细微调整,当然也可以自己扩展这两种应用模式。 二、应用模式定义在ThinkPHP框架当中除了ThinkPHP框架入口和框架引导类以外,基本所有其他功能都可以通过应用模式进行更改和扩展,如果我们要增加一个应用模式,只需要在ThinkPHPMode目录下面定义一个模式定义文件即可,我们可以通过分析common模式进行学习。该文件的代码如下: array(
THINK_PATH.'Conf/convention.php',// 系统惯例配置
CONF_PATH.'config.php',// 应用公共配置
),// 别名定义
'alias' => array(
'ThinkLog' => CORE_PATH . 'Log'.EXT,'ThinkLogDriverFile' => CORE_PATH . 'Log/Driver/File'.EXT,'ThinkException' => CORE_PATH . 'Exception'.EXT,'ThinkModel' => CORE_PATH . 'Model'.EXT,'ThinkDb' => CORE_PATH . 'Db'.EXT,'ThinkTemplate' => CORE_PATH . 'Template'.EXT,'ThinkCache' => CORE_PATH . 'Cache'.EXT,'ThinkCacheDriverFile' => CORE_PATH . 'Cache/Driver/File'.EXT,'ThinkStorage' => CORE_PATH . 'Storage'.EXT,),// 函数和类文件
'core' => array(
THINK_PATH.'Common/functions.php',COMMON_PATH.'Common/function.php',CORE_PATH . 'Hook'.EXT,CORE_PATH . 'App'.EXT,CORE_PATH . 'Dispatcher'.EXT,//CORE_PATH . 'Log'.EXT,CORE_PATH . 'Route'.EXT,CORE_PATH . 'Controller'.EXT,CORE_PATH . 'View'.EXT,BEHAVIOR_PATH . 'BuildLiteBehavior'.EXT,BEHAVIOR_PATH . 'ParseTemplateBehavior'.EXT,BEHAVIOR_PATH . 'ContentReplaceBehavior'.EXT,// 行为扩展定义
'tags' => array(
'app_init' => array(
'BehaviorBuildLiteBehavior',// 生成运行Lite文件
),'app_begin' => array(
'BehaviorReadHtmlCacheBehavior',// 读取静态缓存
),'app_end' => array(
'BehaviorShowPageTraceBehavior',// 页面Trace显示
),'view_parse' => array(
'BehaviorParseTemplateBehavior',// 模板解析 支持PHP、内置模板引擎和第三方模板引擎
),'template_filter'=> array(
'BehaviorContentReplaceBehavior',// 模板输出替换
),'view_filter' => array(
'BehaviorWriteHtmlCacheBehavior',// 写入静态缓存
),);
我们看到这个普通应用模式代码之后,有点明了ThinkPHP的应用模式扩展是怎么回事了,但是还是知其然而不知其所以然,定义一个加载文件列表和配置是如何改变框架核心的呢?秘密就在ThinkPHP引导类中,让我们再回顾以下吧! //加载模式中定义的config配置文件列表
foreach ($mode['config'] as $key=>$file){
is_numeric($key)?C(include $file):C($key,include $file);
}
// 读取当前应用模式对应的配置文件
if('common' != APP_MODE && is_file(CONF_PATH.'config_'.APP_MODE.'.php'))
C(include CONF_PATH.'config_'.APP_MODE.'.php');
// 加载模式中alias别名列表定义
if(isset($mode['alias'])){
self::addMap(is_array($mode['alias'])?$mode['alias']:include $mode['alias']);
}
// 加载应用别名定义文件
if(is_file(CONF_PATH.'alias.php'))
self::addMap(include CONF_PATH.'alias.php');
// 加载模式中tags行为定义
if(isset($mode['tags'])) {
Hook::import(is_array($mode['tags'])?$mode['tags']:include $mode['tags']);
}
// 加载应用行为定义
if(is_file(CONF_PATH.'tags.php'))
// 允许应用增加开发模式配置定义
Hook::import(include CONF_PATH.'tags.php');
// 加载框架底层语言包
L(include THINK_PATH.'Lang/'.strtolower(C('DEFAULT_LANG')).'.php');
通过ThinkPHP::start()中的这段代码,完美无缝关联的模式定义文件的意义与实现方法。 三、定义简单的运行模式手册中有一个模式扩展到的实例,可以拿到这里来分析一下,定义一个lite简洁运行模式,首先在ThinkPHP/Mode目录下新建一个lite.php文件内容定义如下: array(
THINK_PATH.'Conf/convention.php',// 系统惯例配置
CONF_PATH.'config.php',// 应用公共配置
),// 别名定义
'alias' => array(
'ThinkException' => CORE_PATH . 'Exception'.EXT,// 函数和类文件
'core' => array(
MODE_PATH.'Lite/functions.php',MODE_PATH . 'Lite/App'.EXT,MODE_PATH . 'Lite/Dispatcher'.EXT,MODE_PATH . 'Lite/Controller'.EXT,MODE_PATH . 'Lite/View'.EXT,CORE_PATH . 'Behavior'.EXT,// 行为扩展定义
'tags' => array(
'view_parse' => array(
'BehaviorParseTemplate',// 模板解析 支持PHP、内置模板引擎和第三方模板引擎
),'template_filter'=> array(
'BehaviorContentReplace',// 模板输出替换
),);
从上面的配置当中我们发现core中的核心文件大多数都被替换了,当然这些需要被替换的程序功能需要我们自己去实现,不过建议大家直接拷贝普通模式中定义的核心文件过来修改。接下来我们来实现以下Think开发中的核心类库扩展文件App.class.php 在ThinkPHP/Mode目录下建立一个Lite目录并在lite目录下建立App.class.php文件,以下是程序文件的实现: /**
/**
/**
static public function logo(){ 当文件所有扩展文件的实现后,可以在框架入口文件定义APP_MODE常量为lite。另外需要注意一点, 手册当中要求定义的MODE_NAME常量来改变运行模式是之前3.1版本中定义运行模式的方法,使用新版本的用户对此需要注意。(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |