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神秘应用架构扩展的更多相关文章

  1. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...

  2. 扩展Microsoft Graph数据结构 - 架构扩展

    前言 此前我有一篇 文章 讲解了Microsoft Graph的一种数据扩展技术-- 开发扩展(Open Extensions),它可以实现在支持的对象(例如用户,组等)上面附加任意的数据.但开放扩展 ...

  3. EF架构~扩展一个分页处理大数据的方法

    回到目录 最近总遇到大数据的问题,一次性处理几千万数据不实际,所以,我们需要对大数据进行分块处理,或者叫分页处理,我在EF架构里曾经写过类似的,那是在进行BulkInsert时,对大数据批量插入时候用 ...

  4. ThinkPHP框架设计与扩展总结

    详见:http://www.ucai.cn/blogdetail/7028?mid=1&f=5 可在线运行查看效果哦 导言:ThinkPHP框架是国内知名度很高应用很广泛的php框架,我们从一 ...

  5. [js插件开发教程]原生js仿jquery架构扩展开发选项卡插件

    jquery插件一般是这么干的: $.fn.插件名称 = function(){}, 把插件的名称加在.fn上,在源码里面实际上是扩展到构造函数的原型对象上,如果你没看过jquery的源代码,或者你曾 ...

  6. thinkphp 6.0 swoole扩展websocket使用教程

    前言 ThinkPHP即将迎来最新版本6.0,针对目前越来越流行Swoole,thinkphp也推出了最新的扩展think-swoole 3.0. 介绍 即将推出的tp6.0,已经适配swoole.并 ...

  7. ThinkPHP中的行为扩展和插件详解

    原理分析 将标签与类之间的对应关系(如'app_init'=>array('Common\Behavior\InitHook')),通过Hook类中import或add方法,加载到Hook类中静 ...

  8. ThinkPHP 3.2 vendor()方法的深入研究及Phpqrcode的正确扩展

    ThinkPHP vendor 方法导入第三方类库 第三方类库 第三方类库指除了 ThinkPHP 框架.应用项目类库之外的其他类库,一般由第三方系统或产品提供,如 Smarty.Zend 等系统的类 ...

  9. MySql(十二):MySql架构设计——可扩展设计的基本原则

    一.前言 科技在发展,硬件设备的发展渐渐无法满足应用系统对处理能力的要求.不过,我们还是可以通过改造系统的架构体系,提升系统的扩展能力,通过组合多个低处理能力的硬件设备来达到一个高处理能力的系统,也就 ...

随机推荐

  1. 如何找到w3wp与w3svc的对应关系

    在生产环境中,一般会有多个IIS进程在运行,这里面可能是有Web Garden的设置,也可能是有多个application pool在运行.而我们经常在c:\inetpub\logs目录下面,看到很多 ...

  2. 未能加载文件或程序集“Common”或它的某一个依赖项。试图加载格式不正确的程序

    原因:操作系统是64位的,但发布的程序引用了一些32位的ddl,所以出现了兼容性的问题解决方案一:如果是64位机器,IIS——应用程序池——高级设置——启用32位应用程序 :true.解决方案二:修改 ...

  3. ruby简单的基本 3

    类 Ruby一切都是对象,它包含了一个恒定.例如,可以使用.class物业查看对象的类型,你可以看一下1.class.你会发现常1类型是Fixnum,1但它是Fixnum的一个例子. Ruby本类cl ...

  4. 声明式编程思想和EEPlat

    声明式编程定义 声明式编程(英语:Declarativeprogramming)它是一种编程范式.程相对立.它描写叙述目目标性质,让计算机明白目标,而非流程. 声明式编程不用告诉电脑问题领域.从而避免 ...

  5. mac提升yosemite后php 扩展修复

    mac升级之后 php 正积极提升自己,导致php环境破坏 所以 例如有以下几点需要修复 1. sudo ln -s /Applications/Xcode.app/Contents/Develope ...

  6. 【微信公众平台开发】百度周边搜索接口php封装

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWl2YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...

  7. ASP.NET MVC4实现URL伪静态

    1.在Web.config添加节点配置: <system.webServer> <modules runAllManagedModulesForAllRequests="t ...

  8. 联想G480安装CentOS电缆驱动器

    最近.联想G480 32本机安装现场CentOS 6.5. 发现.总是无法使用有线网络. 必须安装必要的驱动,搜集了资料,安装过程例如以下: 1. 必备的软件 安装前,须要下列的软件依赖包. sudo ...

  9. Windows 2008 卸载 IIS7 批处理

    @echo offcolor 0aecho 正在卸载IIS功能,这可能需要几分钟时间...start /w pkgmgr /uu:IIS-WebServerRole;WAS-WindowsActiva ...

  10. HDU ACM 1068 最大独立集

    意甲冠军:n同学.有些学生将有宿命的男性和女性成为恋人.收集注定要成为爱好者求学生的最大数目不存在. 分析:独立设置,顶点设定图的一个子集,在休闲2不连续: 二分图:最大独立集 = 顶点 - 匹配的最 ...