侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

ThinkPHP应用模式扩展详解

ThinkPHP  /  管理员 发布于 8年前   203

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的应用模式扩展是怎么回事了,但是还是知其然而不知其所以然,定义一个加载文件列表和配置是如何改变框架核心的呢?秘密就在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(       '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常量来改变运行模式是之前3.1版本中定义运行模式的方法,使用新版本的用户对此需要注意。

您可能感兴趣的文章:

  • ThinkPHP行为扩展Behavior应用实例详解
  • ThinkPHP框架设计及扩展详解
  • ThinkPHP的Widget扩展实例
  • 老生常谈ThinkPHP中的行为扩展和插件(推荐)
  • TP5(thinkPHP5)框架mongodb扩展安装及特殊操作示例
  • 针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
  • thinkphp5框架扩展redis类方法示例
  • thinkPHP3.2.2框架行为扩展及demo示例
  • thinkPHP下的widget扩展用法实例分析
  • ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
  • ThinkPHP中Widget扩展的两种写法及调用方法详解
  • thinkphp5框架实现的自定义扩展类操作示例
  • thinkphp框架类库扩展操作示例


  • 上一条:
    ThinkPHP跳转页success及error模板实例教程
    下一条:
    ThinkPHP惯例配置文件详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • thinkphp + mongodb项目中数据加载慢问题分析及解决(0个评论)
    • thinkphp6框架中封装redis操作类(0个评论)
    • thinkphp6框架中实现定时任务功能流程步骤(0个评论)
    • Thinkphp5.1框架中实现Session+Redis会话共享流程步骤(0个评论)
    • TP5框架版本5.0.10安全漏洞根据官方补丁修复,也是本站安全漏洞修复(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-12
    • 2018-01
    • 2018-02
    • 2020-03
    • 2021-07
    • 2021-12
    • 2022-05
    • 2022-06
    • 2022-09
    • 2023-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客