当前位置:  编程技术>php

ThinkPHP应用模式扩展详解

    来源: 互联网  发布时间:2014-08-26

    本文导语:  ThinkPHP的应用模式使得开发人员对核心框架进行改造较以往更为得心应手,并且可以让你的应用适应更多的环境和不同的需求。每个应用模式都有自己的模式定义文件,相对于ThinkPHP3.1版本,ThinkPHP3.2版本对应用模式的扩展更加...

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的应用模式扩展是怎么回事了,但是还是知其然而不知其所以然,定义一个加载文件列表和配置是如何改变框架核心的呢?秘密就在ThinkPHP引导类中,让我们再回顾以下吧!

//判断是否存在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常量来改变运行模式是之前3.1版本中定义运行模式的方法,使用新版本的用户对此需要注意。


    
 
 

您可能感兴趣的文章:

  • ThinkPHP CURD方法之order方法教程详解
  • ThinkPHP之N方法实例详解
  • ThinkPHP CURD方法中limit方法教程详解
  • ThinkPHP CURD方法之table方法教程详解
  • ThinkPHP模板判断输出Empty标签用法详解
  • ThinkPHP模板判断输出Present标签用法详解
  • ThinkPHP CURD方法之order方法详解
  • ThinkPHP3.1新特性之内容解析输出详解
  • c/c++ iis7站长之家
  • ThinkPHP空模块和空操作详解
  • ThinkPHP CURD方法之limit方法详解
  • ThinkPHP模板IF标签用法详解
  • ThinkPHP模板判断输出Defined标签用法详解
  • ThinkPHP CURD方法之table方法详解
  • ThinkPHP之R方法实例详解
  • ThinkPHP3.1之D方法实例详解
  • ThinkPHP模板范围判断输出In标签与Range标签用法详解
  • ThinkPHP CURD方法之data方法教程详解
  • 采用thinkphp自带方法生成静态html文件详解
  • ThinkPHP CURD方法之page方法详解
  • ThinkPHP的Widget扩展实例
  • ThinkPHP行为扩展Behavior应用实例详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • ThinkPHP学习笔记(一)ThinkPHP部署
  • ThinkPHP标签怎么制作?thinkphp标签制作实例教程
  • ThinkPHP之N方法实例教程
  • ThinkPHP3.1新特性之对分组支持的改进与完善概述
  • 轻量级PHP开发框架 ThinkPHP
  • 模仿 thinkphp 的 nodejs MVC 框架 Nstorm
  • thinkphp分页保持搜索状态实现方法
  • ThinkPHP中的关联模型注意点
  • ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
  • ThinkPHP之A方法实例教程
  • ThinkPHP让分页保持搜索状态的方法
  • ThinkPHP实现事务回滚示例代码
  • Thinkphp模板中截取字符串函数简介
  • ThinkPHP框架实现session跨域问题的解决方法
  • ThinkPHP命令行工具 Tptool
  • ThinkPHP之foreach标签使用概述
  • ThinkPHP中自定义目录结构的设置方法
  • ThinkPHP模板中判断volist循环的最后一条记录的验证方法
  • 浅析ThinkPHP中execute和query方法的区别
  • ThinkPHP的模版中调用session数据的方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3