首頁 後端開發 php教程 ThinkPHP应用形式扩展之谜

ThinkPHP应用形式扩展之谜

Jun 13, 2016 pm 12:01 PM
core mode path thinkphp

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框架入口和框架引导类以外,基本所有其他功能都可以通过应用模式进行更改和扩展,如果我们要增加一个应用模式,只需要在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日的版本)。


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1659
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1231
24
thinkphp專案怎麼運行 thinkphp專案怎麼運行 Apr 09, 2024 pm 05:33 PM

執行 ThinkPHP 專案需要:安裝 Composer;使用 Composer 建立專案;進入專案目錄,執行 php bin/console serve;造訪 http://localhost:8000 查看歡迎頁面。

thinkphp有幾個版本 thinkphp有幾個版本 Apr 09, 2024 pm 06:09 PM

ThinkPHP 擁有多個版本,針對不同 PHP 版本而設計。主要版本包括 3.2、5.0、5.1 和 6.0,而次要版本用於修復 bug 和提供新功能。目前最新穩定版本為 ThinkPHP 6.0.16。在選擇版本時,需考慮 PHP 版本、功能需求和社群支援。建議使用最新穩定版本以獲得最佳性能和支援。

設定Linux系統的PATH環境變數步驟 設定Linux系統的PATH環境變數步驟 Feb 18, 2024 pm 05:40 PM

Linux系統如何設定PATH環境變數在Linux系統中,PATH環境變數用來指定係統在命令列中搜尋執行檔的路徑。正確設定PATH環境變數可以方便我們在任何位置執行系統指令和自訂指令。本文將介紹如何在Linux系統中設定PATH環境變量,並提供詳細的程式碼範例。查看目前的PATH環境變數在終端機中執行以下指令,可以查看目前的PATH環境變數:echo$P

thinkphp怎麼運行 thinkphp怎麼運行 Apr 09, 2024 pm 05:39 PM

ThinkPHP Framework 的本機運作步驟:下載並解壓縮 ThinkPHP Framework 到本機目錄。建立虛擬主機(可選),指向 ThinkPHP 根目錄。配置資料庫連線參數。啟動 Web 伺服器。初始化 ThinkPHP 應用程式。存取 ThinkPHP 應用程式 URL 運行。

laravel和thinkphp哪個好 laravel和thinkphp哪個好 Apr 09, 2024 pm 03:18 PM

Laravel 和 ThinkPHP 框架的效能比較:ThinkPHP 效能通常優於 Laravel,專注於最佳化和快取。 Laravel 性能良好,但對於複雜應用程序,ThinkPHP 可能更適合。

開發建議:如何利用ThinkPHP框架實現非同步任務 開發建議:如何利用ThinkPHP框架實現非同步任務 Nov 22, 2023 pm 12:01 PM

《開發建議:如何利用ThinkPHP框架實現非同步任務》隨著網路技術的快速發展,Web應用程式對於處理大量並發請求和複雜業務邏輯的需求也越來越高。為了提高系統的效能和使用者體驗,開發人員常常會考慮利用非同步任務來執行一些耗時操作,例如發送郵件、處理文件上傳、產生報表等。在PHP領域,ThinkPHP框架作為一個流行的開發框架,提供了一些便捷的方式來實現非同步任務。

thinkphp怎麼安裝 thinkphp怎麼安裝 Apr 09, 2024 pm 05:42 PM

ThinkPHP 安裝步驟:準備 PHP、Composer、MySQL 環境。使用 Composer 建立專案。安裝 ThinkPHP 框架及相依性。配置資料庫連線。產生應用程式碼。啟動應用程式並造訪 http://localhost:8000。

thinkphp效能怎麼樣 thinkphp效能怎麼樣 Apr 09, 2024 pm 05:24 PM

ThinkPHP 是一款高效能的 PHP 框架,具備快取機制、程式碼最佳化、平行處理和資料庫最佳化等優勢。官方性能測試顯示,它每秒可處理超過 10,000 個請求,實際應用中被廣泛用於京東商城、攜程網等大型網站和企業系統。

See all articles