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. MVC Code First (代码优先)

    首先配置web.config <connectionStrings> <add name="BookDbContext" connectionString=&qu ...

  2. docker 真实---安装基本映像 (一)

    浸泡了几天的官方网站,正确docker有了更好的理解.准备着手建立一个公司的开发和测试环境,包含java.python. 环境介绍 首先说明一下我的环境 2物理server(以后简称为主机) 主机A配 ...

  3. BibTex (.bib) 文件的凝视

    1) 将某个參考文献所有去掉,能够去掉前面的『@』 样例 @article{##,    author = {###},    title = {###},    journal = {###},   ...

  4. 无尽的循环ViewPager

    现在的情况 不改变的源代码,什么时候ViewPager滑动到最后item的时候,他就无法再往右滑动:当ViewPager滑动到第一个item的时候,他也无法再往前滑动. (以上全是废话) 设想 我们能 ...

  5. STM32 水晶不摇

    刚刚得到一个新的董事会,该设备被编程为去,但执行地址不正确,没有进入c语言 没有进入c语言,有可能是一个难以回答的问题狗,硬狗拆除 检查以下四种情况 1.检查片内的功率是所有权利 2.检查晶体线短路 ...

  6. Tuple

    Tuple(组元)是C# 4.0引入的一个新特性,编写的时候需要基于.NET Framework 4.0或者更高版本. 在以前编程中,当需要返回多个值得方法中,常常需要将这些值放置到一个结构体或者对象 ...

  7. Quartz(GUI)图形界面程序----Quartz Web

    下载.设置和运行Quartz(GUI)图形界面程序----Quartz Web 一.获取Quartz Web程序(Quartz GUI).早期的 Quartz 框架开发者意识到一个 GUI 对于某类用 ...

  8. 简单 TCP/IP 服务功能

    本主题使用每台 Windows 计算机上提供的 Echo 和 Quote of the Day 服务.在所有 Windows 版本中都提供了简单 TCP/IP 服务功能.该功能会提供了以下服务:Cha ...

  9. vim cheat sheet

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzE1Mjg5NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  10. ANDROID嵌入式应用Unity3D视图(画廊3D模型)

    转载请注明来自大型玉米的博客文章(http://blog.csdn.net/a396901990),谢谢支持! 效果展示:   watermark/2/text/aHR0cDovL2Jsb2cuY3N ...