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框架入口和框架引导类以外,基本全部其它功能都能够通过应用模式进行更改和扩展,假设我们要添加一个应用模式,仅仅须要在ThinkPHPMode文件夹以下定义一个模式定义文件就可以。我们能够通过分析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(
        '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的应用模式扩展是怎么回事了,可是还是知其然而不知其所以然,定义一个载入文件列表和配置是怎样改变框架核心的呢?秘密就在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(
              'ThinkException'         => CORE_PATH . 'Exception'.EXT,
              'ThinkModel'             => CORE_PATH . 'Model'.EXT, 
              'ThinkDb'                => CORE_PATH . 'Db'.EXT,
              'ThinkCache'             => CORE_PATH . 'Cache'.EXT,
              'ThinkCacheDriverFile' => CORE_PATH . 'Cache/Driver/File'.EXT,
              'ThinkStorage'           => 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(
                     'BehaviorParseTemplate', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎
               ),
               'template_filter'=> array(
                     'BehaviorContentReplace', // 模板输出替换
               ),
 ),
);


从上面的配置其中我们发现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版本号天)。


版权声明:本文博主原创文章,博客,未经同意不得转载。

原文地址:https://www.cnblogs.com/mengfanrong/p/4850655.html