ThinkPHP應(yīng)用模式擴(kuò)展詳解
ThinkPHP的應(yīng)用模式使得開發(fā)人員對(duì)核心框架進(jìn)行改造較以往更為得心應(yīng)手,并且可以讓你的應(yīng)用適應(yīng)更多的環(huán)境和不同的需求。每個(gè)應(yīng)用模式都有自己的模式定義文件,相對(duì)于ThinkPHP3.1版本,ThinkPHP3.2版本對(duì)應(yīng)用模式的擴(kuò)展更加明確和清晰,在ThinkPHP3.1版本中定義了Cli、Lite、Thin、AMF、PHPRPC、REST模式,其定義方式和ThinkPHP3.2版本的方式大同小異,如有需要可以參考修改,其中Cli模式被ThinkPHP框架內(nèi)置,不用單獨(dú)定義Cli模式即可正常使用,如需要更細(xì)化調(diào)整可以參考3.1版編寫的Cli運(yùn)行模式擴(kuò)展。ThinkPHP同樣提供了便捷的開發(fā)環(huán)境和正式環(huán)境的模式切換方式。讓我們隨著ThinkPHP的運(yùn)行流程解析其應(yīng)用模式擴(kuò)展之謎。
一、應(yīng)用模式的使用
在研究應(yīng)用模式擴(kuò)展之前,看看如何使用應(yīng)用模式的吧。一般通過在入口文件定義常量APP_MODE為應(yīng)用模式名稱,但是在分析ThinkPHP框架入口文件時(shí),了解到框架默認(rèn)采用模式為普通模式(common),而且可以自動(dòng)識(shí)別sae環(huán)境,當(dāng)然前提是沒有定義APP_MODE常量時(shí),當(dāng)然ThinkPHP可以自動(dòng)識(shí)別CLI和CGI模式,并且在CLI和CGI環(huán)境下運(yùn)行ThinkPHP框架在默認(rèn)模式中自動(dòng)對(duì)這兩種環(huán)境做了細(xì)微調(diào)整,當(dāng)然也可以自己擴(kuò)展這兩種應(yīng)用模式。
if(function_exists('saeAutoLoader')){// 自動(dòng)識(shí)別SAE環(huán)境 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'); // 應(yīng)用模式 默認(rèn)為普通模式 defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'File'); // 存儲(chǔ)類型 默認(rèn)為File }
二、應(yīng)用模式定義
在ThinkPHP框架當(dāng)中除了ThinkPHP框架入口和框架引導(dǎo)類以外,基本所有其他功能都可以通過應(yīng)用模式進(jìn)行更改和擴(kuò)展,如果我們要增加一個(gè)應(yīng)用模式,只需要在ThinkPHP\Mode目錄下面定義一個(gè)模式定義文件即可,我們可以通過分析common模式進(jìn)行學(xué)習(xí)。該文件的代碼如下:
//文件路徑:ThinkPHP/Mode/common.php /** * ThinkPHP 普通模式定義 * 定義一個(gè)模式文件,只需要返回一個(gè)模式包含文件的數(shù)組即可 * 在數(shù)組中主要包含4種擴(kuò)展文件列表: * config 為默認(rèn)加載配置文件列表 * alias 為核心類庫(kù)別名配置列表 * core 需要加載的核心函數(shù)和類文件列表 * tags 行為配置列表 * * 如果在應(yīng)用模式定義中加載一個(gè)自定類,那個(gè)自定義類的命名空間必須是Think */ return array( // 配置文件 'config' => array( THINK_PATH.'Conf/convention.php', // 系統(tǒng)慣例配置 CONF_PATH.'config.php', // 應(yīng)用公共配置 ), // 別名定義 '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, ), // 函數(shù)和類文件 '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, ), // 行為擴(kuò)展定義 'tags' => array( 'app_init' => array( 'Behavior\BuildLiteBehavior', // 生成運(yùn)行Lite文件 ), 'app_begin' => array( 'Behavior\ReadHtmlCacheBehavior', // 讀取靜態(tài)緩存 ), 'app_end' => array( 'Behavior\ShowPageTraceBehavior', // 頁(yè)面Trace顯示 ), 'view_parse' => array( 'Behavior\ParseTemplateBehavior', // 模板解析 支持PHP、內(nèi)置模板引擎和第三方模板引擎 ), 'template_filter'=> array( 'Behavior\ContentReplaceBehavior', // 模板輸出替換 ), 'view_filter' => array( 'Behavior\WriteHtmlCacheBehavior', // 寫入靜態(tài)緩存 ), ), );
我們看到這個(gè)普通應(yīng)用模式代碼之后,有點(diǎn)明了ThinkPHP的應(yīng)用模式擴(kuò)展是怎么回事了,但是還是知其然而不知其所以然,定義一個(gè)加載文件列表和配置是如何改變框架核心的呢?秘密就在ThinkPHP引導(dǎo)類中,讓我們?cè)倩仡櫼韵掳桑?/p>
//判斷是否存在core.php配置文件(這是開發(fā)環(huán)境臨時(shí)定義的運(yùn)行模式,我是這么理解的) //否者加載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); } // 讀取當(dāng)前應(yīng)用模式對(duì)應(yīng)的配置文件 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']); } // 加載應(yīng)用別名定義文件 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']); } // 加載應(yīng)用行為定義 if(is_file(CONF_PATH.'tags.php')) // 允許應(yīng)用增加開發(fā)模式配置定義 Hook::import(include CONF_PATH.'tags.php'); // 加載框架底層語(yǔ)言包 L(include THINK_PATH.'Lang/'.strtolower(C('DEFAULT_LANG')).'.php');
通過ThinkPHP::start()中的這段代碼,完美無(wú)縫關(guān)聯(lián)的模式定義文件的意義與實(shí)現(xiàn)方法。
三、定義簡(jiǎn)單的運(yùn)行模式
手冊(cè)中有一個(gè)模式擴(kuò)展到的實(shí)例,可以拿到這里來(lái)分析一下,定義一個(gè)lite簡(jiǎn)潔運(yùn)行模式,首先在ThinkPHP/Mode目錄下新建一個(gè)lite.php文件內(nèi)容定義如下:
return array( // 配置文件 'config' => array( THINK_PATH.'Conf/convention.php', // 系統(tǒng)慣例配置 CONF_PATH.'config.php', // 應(yīng)用公共配置 ), // 別名定義 '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, ), // 函數(shù)和類文件 '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, ), // 行為擴(kuò)展定義 'tags' => array( 'view_parse' => array( 'Behavior\ParseTemplate', // 模板解析 支持PHP、內(nèi)置模板引擎和第三方模板引擎 ), 'template_filter'=> array( 'Behavior\ContentReplace', // 模板輸出替換 ), ), );
從上面的配置當(dāng)中我們發(fā)現(xiàn)core中的核心文件大多數(shù)都被替換了,當(dāng)然這些需要被替換的程序功能需要我們自己去實(shí)現(xiàn),不過建議大家直接拷貝普通模式中定義的核心文件過來(lái)修改。接下來(lái)我們來(lái)實(shí)現(xiàn)以下ThinkPHP應(yīng)用開發(fā)中的核心類庫(kù)擴(kuò)展文件App.class.php
在ThinkPHP/Mode目錄下建立一個(gè)Lite目錄并在lite目錄下建立App.class.php文件,以下是程序文件的實(shí)現(xiàn):
//模式擴(kuò)展類庫(kù)必須是Think命名空間 namespace Think; /** * ThinkPHP 應(yīng)用程序類 執(zhí)行應(yīng)用過程管理 Lite模式擴(kuò)展類 * 實(shí)現(xiàn)ThinkPHP核心類庫(kù)擴(kuò)展時(shí),盡可能仿造原有類庫(kù)實(shí)現(xiàn)(除非對(duì)ThinkPHP框架源碼特別了解) * 因?yàn)樵谄渌麤]有擴(kuò)展的核心文件中可能會(huì)調(diào)用擴(kuò)展的核心類文件中的某個(gè)方法,除非你打算全部擴(kuò)展 */ class App{ /** * 應(yīng)用程序初始化 * @access public * @return void */ static public function init() { //具體現(xiàn)實(shí) } /** * 執(zhí)行應(yīng)用程序 * @access public * @return void */ static public function exec() { //具體實(shí)現(xiàn) } /** * 運(yùn)行應(yīng)用實(shí)例 入口文件使用的快捷方法 * @access public * @return void */ static public function run() { //具體實(shí)現(xiàn) } static public function logo(){ //具體實(shí)現(xiàn) } }
當(dāng)文件所有擴(kuò)展文件的實(shí)現(xiàn)后,可以在框架入口文件定義APP_MODE常量為lite。
另外需要注意一點(diǎn),手冊(cè)當(dāng)中要求定義的MODE_NAME常量來(lái)改變運(yùn)行模式是之前3.1版本中定義運(yùn)行模式的方法,使用新版本的用戶對(duì)此需要注意。
- Thinkphp 框架擴(kuò)展之標(biāo)簽庫(kù)驅(qū)動(dòng)原理與用法分析
- Thinkphp 框架擴(kuò)展之?dāng)?shù)據(jù)庫(kù)驅(qū)動(dòng)常用方法小結(jié)
- thinkPHP5.0框架整體架構(gòu)總覽【應(yīng)用,模塊,MVC,驅(qū)動(dòng),行為,命名空間等】
- Thinkphp 框架擴(kuò)展之應(yīng)用模式實(shí)現(xiàn)方法分析
- Thinkphp 框架擴(kuò)展之Widget擴(kuò)展實(shí)現(xiàn)方法分析
- Thinkphp 框架擴(kuò)展之行為擴(kuò)展原理與實(shí)現(xiàn)方法分析
- Thinkphp 框架擴(kuò)展之類庫(kù)擴(kuò)展操作詳解
- thinkphp框架類庫(kù)擴(kuò)展操作示例
- ThinkPHP行為擴(kuò)展Behavior應(yīng)用實(shí)例詳解
- ThinkPHP的Widget擴(kuò)展實(shí)例
- Thinkphp 框架擴(kuò)展之驅(qū)動(dòng)擴(kuò)展實(shí)例分析
相關(guān)文章
laravel實(shí)現(xiàn)按月或天或小時(shí)統(tǒng)計(jì)mysql數(shù)據(jù)的方法
今天小編就為大家分享一篇laravel實(shí)現(xiàn)按月或天或小時(shí)統(tǒng)計(jì)mysql數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-10-10PHP之使用swoole統(tǒng)計(jì)在線人數(shù)和ID案例講解
這篇文章主要介紹了PHP之使用swoole統(tǒng)計(jì)在線人數(shù)和ID案例講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08修改yii2.0用戶登錄使用的user表為其它的表實(shí)現(xiàn)方法(推薦)
下面小編就為大家?guī)?lái)一篇修改yii2.0用戶登錄使用的user表為其它的表實(shí)現(xiàn)方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-08-08yii2使用GridView實(shí)現(xiàn)數(shù)據(jù)全選及批量刪除按鈕示例
本篇文章主要介紹了yii2使用GridView實(shí)現(xiàn)數(shù)據(jù)全選及批量刪除按鈕示例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-03-03PHP與Web頁(yè)面交互例子的實(shí)現(xiàn)
本文主要介紹了PHP?與?Web?頁(yè)面交互例子的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01destoon實(shí)現(xiàn)VIP排名一直在前面排序的方法
這篇文章主要介紹了destoon實(shí)現(xiàn)VIP排名一直在前面排序的方法,在destoon開發(fā)中非常實(shí)用,需要的朋友可以參考下2014-08-08PHP+shell腳本操作Memcached和Apache Status的實(shí)例分享
這篇文章主要介紹了PHP環(huán)境下使用shell腳本操作Memcached和Apache Status的方法,分別還可以控制Memcached進(jìn)程的啟動(dòng)以及記錄Apache Status數(shù)據(jù)到數(shù)據(jù)庫(kù),需要的朋友可以參考下2016-03-03php分頁(yè)查詢的簡(jiǎn)單實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了php分頁(yè)查詢的簡(jiǎn)單實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03php圖片水印添加、壓縮、剪切的封裝類實(shí)現(xiàn)
這篇文章主要介紹了php圖片水印添加,壓縮,剪切的封裝類實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-09-09