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框架在默认模式中自己主动对这两种环境做了细微调整,当然也能够自己扩展这两种应用模式。
if(function_exists('saeAutoLoader')){// 自己主动识别SAE环境
defined('APP_MODE') or define('APP_MODE', 'sae');
defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'Sae');
}else{
defined('APP_MODE') or define('APP_MODE', 'common'); // 应用模式 默觉得普通模式
defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'File'); // 存储类型 默觉得File
}
二、应用模式定义
在ThinkPHP框架其中除了ThinkPHP框架入口和框架引导类以外,基本全部其它功能都能够通过应用模式进行更改和扩展,假设我们要添加一个应用模式,仅仅须要在ThinkPHP\Mode文件夹以下定义一个模式定义文件就可以。我们能够通过分析common模式进行学习。
//文件路径:ThinkPHP/Mode/common.php
/**
* ThinkPHP 普通模式定义
* 定义一个模式文件。仅仅须要返回一个模式包括文件的数组就可以
* 在数组中主要包括4种扩展文件列表:
* config 为默认载入配置文件列表
* alias 为核心类库别名配置列表
* core 须要载入的核心函数和类文件列表
* tags 行为配置列表
*
* 假设在应用模式定义中载入一个自定类。那个自己定义类的命名空间必须是Think
*/
return array(
// 配置文件
'config' => array(
THINK_PATH.'Conf/convention.php', // 系统惯例配置
CONF_PATH.'config.php', // 应用公共配置
), // 别名定义
'alias' => array(
'Think\Log' => CORE_PATH . 'Log'.EXT,
'Think\Log\Driver\File' => CORE_PATH . 'Log/Driver/File'.EXT,
'Think\Exception' => CORE_PATH . 'Exception'.EXT,
'Think\Model' => CORE_PATH . 'Model'.EXT,
'Think\Db' => CORE_PATH . 'Db'.EXT,
'Think\Template' => CORE_PATH . 'Template'.EXT,
'Think\Cache' => CORE_PATH . 'Cache'.EXT,
'Think\Cache\Driver\File' => CORE_PATH . 'Cache/Driver/File'.EXT,
'Think\Storage' => 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(
'Behavior\BuildLiteBehavior', // 生成执行Lite文件
),
'app_begin' => array(
'Behavior\ReadHtmlCacheBehavior', // 读取静态缓存
),
'app_end' => array(
'Behavior\ShowPageTraceBehavior', // 页面Trace显示
),
'view_parse' => array(
'Behavior\ParseTemplateBehavior', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎
),
'template_filter'=> array(
'Behavior\ContentReplaceBehavior', // 模板输出替换
),
'view_filter' => array(
'Behavior\WriteHtmlCacheBehavior', // 写入静态缓存
),
),
);
我们看到这个普通应用模式代码之后,有点明了ThinkPHP的应用模式扩展是怎么回事了,可是还是知其然而不知其所以然,定义一个载入文件列表和配置是怎样改变框架核心的呢?秘密就在ThinkPHPK引导类中,让我们再回想下面吧。
//推断是否存在core.php配置文件(这是开发环境暂时定义的执行模式,我是这么理解的)
//否者载入APP_MODE定义的模式文件
$mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';
//载入模式中core定义的核心文件列表
foreach ($mode['core'] as $file){
if(is_file($file)) {
include $file;
if(!APP_DEBUG) $content .= compile($file);
}
} //载入模式中定义的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文件内容定义例如以下:
return array(
// 配置文件
'config' => array(
THINK_PATH.'Conf/convention.php', // 系统惯例配置
CONF_PATH.'config.php', // 应用公共配置
), // 别名定义
'alias' => array(
'Think\Exception' => CORE_PATH . 'Exception'.EXT,
'Think\Model' => CORE_PATH . 'Model'.EXT,
'Think\Db' => CORE_PATH . 'Db'.EXT,
'Think\Cache' => CORE_PATH . 'Cache'.EXT,
'Think\Cache\Driver\File' => CORE_PATH . 'Cache/Driver/File'.EXT,
'Think\Storage' => CORE_PATH . 'Storage'.EXT,
), // 函数和类文件
'core' => array(
MODE_PATH.'Lite/functions.php',
COMMON_PATH.'Common/function.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(
'Behavior\ParseTemplate', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎
),
'template_filter'=> array(
'Behavior\ContentReplace', // 模板输出替换
),
),
);
从上面的配置其中我们发现core中的核心文件大多数都被替换了,当然这些须要被替换的程序功能须要我们自己去实现,只是建议大家直接拷贝普通模式中定义的核心文件过来改动。接下来我们来实现下面ThinkPHP应用开发中的核心类库扩展文件App.class.php
在ThinkPHP/Mode文件夹下建立一个Lite文件夹并在lite文件夹下建立App.class.php文件。下面是程序文件的实现:
//模式扩展类库必须是Think命名空间
namespace Think; /**
* ThinkPHP 应用程序类 运行应用过程管理 Lite模式扩展类
* 实现ThinkPHP核心类库扩展时,尽可能仿造原有类库实现(除非对ThinkPHP框架源代码特别了解)
* 由于在其它没有扩展的核心文件里可能会调用扩展的核心类文件里的某个方法,除非你打算所有扩展
*/
class App{
/**
* 应用程序初始化
* @access public
* @return void
*/
static public function init() {
//详细现实
} /**
* 运行应用程序
* @access public
* @return void
*/
static public function exec() {
//详细实现
} /**
* 运行应用实例 入口文件使用的快捷方法
* @access public
* @return void
*/
static public function run() {
//详细实现
} static public function logo(){
//详细实现
}
}
当文件全部扩展文件的实现后,能够在框架入口文件定义APP_MODE常量为lite。
在这里吐槽下面官方:本节手冊其中竟然要定义MODE_NAME常量来改变执行模式,为了准确性无奈在ThinkPHP框架所有文件里搜索MODE_NAME。结果都没有才放下一个悬着的心。这是之前3.1版本号中定义执行模式的方法,手冊更新细节问称号(声明一下,我现在用的是手动3.2.12014年2一个月14版本号天)。
版权声明:本文博主原创文章,博客,未经同意不得转载。
ThinkPHP神秘应用架构扩展的更多相关文章
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...
- 扩展Microsoft Graph数据结构 - 架构扩展
前言 此前我有一篇 文章 讲解了Microsoft Graph的一种数据扩展技术-- 开发扩展(Open Extensions),它可以实现在支持的对象(例如用户,组等)上面附加任意的数据.但开放扩展 ...
- EF架构~扩展一个分页处理大数据的方法
回到目录 最近总遇到大数据的问题,一次性处理几千万数据不实际,所以,我们需要对大数据进行分块处理,或者叫分页处理,我在EF架构里曾经写过类似的,那是在进行BulkInsert时,对大数据批量插入时候用 ...
- ThinkPHP框架设计与扩展总结
详见:http://www.ucai.cn/blogdetail/7028?mid=1&f=5 可在线运行查看效果哦 导言:ThinkPHP框架是国内知名度很高应用很广泛的php框架,我们从一 ...
- [js插件开发教程]原生js仿jquery架构扩展开发选项卡插件
jquery插件一般是这么干的: $.fn.插件名称 = function(){}, 把插件的名称加在.fn上,在源码里面实际上是扩展到构造函数的原型对象上,如果你没看过jquery的源代码,或者你曾 ...
- thinkphp 6.0 swoole扩展websocket使用教程
前言 ThinkPHP即将迎来最新版本6.0,针对目前越来越流行Swoole,thinkphp也推出了最新的扩展think-swoole 3.0. 介绍 即将推出的tp6.0,已经适配swoole.并 ...
- ThinkPHP中的行为扩展和插件详解
原理分析 将标签与类之间的对应关系(如'app_init'=>array('Common\Behavior\InitHook')),通过Hook类中import或add方法,加载到Hook类中静 ...
- ThinkPHP 3.2 vendor()方法的深入研究及Phpqrcode的正确扩展
ThinkPHP vendor 方法导入第三方类库 第三方类库 第三方类库指除了 ThinkPHP 框架.应用项目类库之外的其他类库,一般由第三方系统或产品提供,如 Smarty.Zend 等系统的类 ...
- MySql(十二):MySql架构设计——可扩展设计的基本原则
一.前言 科技在发展,硬件设备的发展渐渐无法满足应用系统对处理能力的要求.不过,我们还是可以通过改造系统的架构体系,提升系统的扩展能力,通过组合多个低处理能力的硬件设备来达到一个高处理能力的系统,也就 ...
随机推荐
- JFileChooser
http://www.cnblogs.com/dyllove98/archive/2012/03/05/2461895.html package swing.choose; import java.a ...
- chrome(转)
阅读目录 Chrome的隐身模式 Chrome下各种组合键 Chrome的about指令 chrome://accessibility 查看浏览器当前访问的标签 chrome://appcac ...
- 静态常量(static final)在class文件里是如何的呢?
近期写项目遇到一个问题,来回折腾了几次,最终探究清楚了.不废话.上样例. 背景:由于项目小,没有使用配置文件,全部静态常量都放在Config.java里面了 public class Config { ...
- hdu 5077 NAND(暴力打表)
题目链接:hdu 5077 NAND 题目大意:Xiaoqiang要写一个编码程序,然后依据x1,x2,x3的值构造出8个字符.如今给定要求生成的8个字符.问 说Xiaoqiang最少要写多少行代码. ...
- VisualStudioOnline协同工作流程
VisualStudioOnline协同工作流程 项目负责人登陆自己的vsonline新建项目就不多说了. 直接从邀请队友开始 项目负责人操作 被邀请的邮箱必须是微软的邮箱(也就是可以登录visual ...
- 【转】tomcat 访问软连接文件夹下的网页出现404错误,description The requested resource (/xxx.html) is not available.
在 tomcat/webapps/ROOT/ 下建立一个软连接文件ln -s /home/ubuntu/report report 再到report软连接目录里建立个 report.html通过浏 ...
- UVA - 10714 Ants
最多时间就是每仅仅蚂蚁选择最久的爬行方式 最少时间就是每仅仅蚂蚁选择最快地爬行方式 #include<iostream> #include<map> #include<s ...
- ThreadPoolExecutor的一点理解
整个ThreadPoolExecutor的任务处理有4步操作: 第一步,初始的poolSize < corePoolSize,提交的runnable任务,会直接做为new一个Thread的参数, ...
- Android 儿子Activity在启动过程中的流程组件 && 儿子Activity在一个新的进程组件启动过程
1.儿子Activity在启动过程中的流程组件 在Android Activity启动过程http://blog.csdn.net/jltxgcy/article/details/35984557一文 ...
- React JS高速新手教程
翻译至官方文档<Tutorial>http://facebook.github.io/react/docs/tutorial.html 转载请注明出处:http://blog.csdn.n ...