ThinkPHP行為擴(kuò)展Behavior應(yīng)用實(shí)例詳解
本文以實(shí)例的形式詳細(xì)介紹了ThinkPHP的行為擴(kuò)展Behavior的實(shí)現(xiàn)方法,有助于讀者更靈活的掌握ThinkPHP的開發(fā),具體步驟如下:
ThinkPHP 行為擴(kuò)展 (Behavior) 流程:
最先是讀取配置文件信息:
$mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';
讀取配置文件信息 ThinkPHP\Mode\common.php
// 行為擴(kuò)展定義 'tags' => array( 'app_init' => array( ), 'app_begin' => array( 'Behavior\ReadHtmlCache', // 讀取靜態(tài)緩存 ), 'app_end' => array( 'Behavior\ShowPageTrace', // 頁面Trace顯示 ), 'path_info' => array(), 'action_begin' => array(), 'action_end' => array(), 'view_begin' => array(), 'view_parse' => array( 'Behavior\ParseTemplate', // 模板解析 支持PHP、內(nèi)置模板引擎和第三方模板引擎 ), 'template_filter'=> array( 'Behavior\ContentReplace', // 模板輸出替換 ), 'view_filter' => array( 'Behavior\WriteHtmlCache', // 寫入靜態(tài)緩存 ), 'view_end' => array(), ),
默認(rèn)調(diào)用了系統(tǒng)行為擴(kuò)展:靜態(tài)緩存讀取 、頁面Trace顯示輸出、模板解析、模板內(nèi)容輸出替換、靜態(tài)緩存寫入
// 加載模式行為定義 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');
分別用Hook去加載 系統(tǒng)行為和自定義行為,并把配置信息保存到 Hook 私有屬性$tags中
ThinkPHP\Library\Think\Think.class.php 初始化完成后會調(diào)用App::run();
ThinkPHP\Library\Think\App.class.php文件如下:
/** * 運(yùn)行應(yīng)用實(shí)例 入口文件使用的快捷方法 * @access public * @return void */ static public function run() { // 應(yīng)用初始化標(biāo)簽 Hook::listen('app_init'); App::init(); // 應(yīng)用開始標(biāo)簽 Hook::listen('app_begin'); // Session初始化 if(!IS_CLI){ session(C('SESSION_OPTIONS')); } // 記錄應(yīng)用初始化時(shí)間 G('initTime'); App::exec(); // 應(yīng)用結(jié)束標(biāo)簽 Hook::listen('app_end'); return ; }
可以看出程序在App init之前 通過鉤子去監(jiān)聽(查看)此動作時(shí)是否有需要處理的。循環(huán)$tags['app_init']獲取類名并通過類名自動執(zhí)行行為擴(kuò)展類run方法
所有鉤子如下:
'url_dispatch' // URL調(diào)度結(jié)束標(biāo)簽 'app_init' // 應(yīng)用初始化標(biāo)簽 'app_begin' // 應(yīng)用開始標(biāo)簽 'app_end' // 應(yīng)用結(jié)束標(biāo)簽 'action_begin' // 動作執(zhí)行前操作 'action_end' // 動作執(zhí)行后操作 'ajax_return' // 用于擴(kuò)展其他返回格式數(shù)據(jù) 'path_info' // 檢測路由規(guī)則 如果沒有則按默認(rèn)規(guī)則調(diào)度URL 'template_filter' // 模版編譯過濾標(biāo)簽 'view_begin' // 視圖開始標(biāo)簽 'view_end' // 視圖結(jié)束標(biāo)簽 'view_parse' // 視圖解析標(biāo)簽 'view_filter' // 內(nèi)容過濾標(biāo)簽
缺點(diǎn)如下:
1.順序不可控(配置文件沒有專門的參數(shù)去控制順序)如app_init同時(shí)有2個(gè)監(jiān)控時(shí)先調(diào)用哪個(gè)方法。
2.監(jiān)控不是全局監(jiān)控內(nèi)部寫的太死只有一些定義好的不能通過配置文件去自動控制每一個(gè)操作的鉤子(可能是考慮到性能才沒有加)
優(yōu)點(diǎn)如下:
1.可以實(shí)現(xiàn)了好多行為擴(kuò)展
2.可以代理檢測、瀏覽器防刷新檢測、操作路由檢測等
總結(jié):
行為擴(kuò)展就是在 程序某個(gè)操作時(shí)去額外的去執(zhí)行某一特定功能。如程序在操作數(shù)據(jù)庫 讀的時(shí)候 通過explian獲取性能信息并監(jiān)測性能瓶頸 如出現(xiàn)獲取數(shù)據(jù)時(shí)超過特定秒數(shù) 就把相關(guān)信息email給項(xiàng)目經(jīng)理等。
- Thinkphp5框架簡單實(shí)現(xiàn)鉤子(Hook)行為的方法示例
- thinkPHP基于反射實(shí)現(xiàn)鉤子的方法分析
- thinkPHP中鉤子的使用方法實(shí)例分析
- thinkPHP中鉤子的兩種配置調(diào)用方法詳解
- Thinkphp5行為使用方法匯總
- 老生常談ThinkPHP中的行為擴(kuò)展和插件(推薦)
- thinkPHP5.0框架整體架構(gòu)總覽【應(yīng)用,模塊,MVC,驅(qū)動,行為,命名空間等】
- thinkPHP3.2.2框架行為擴(kuò)展及demo示例
- Thinkphp 框架擴(kuò)展之行為擴(kuò)展原理與實(shí)現(xiàn)方法分析
- thinkphp5.1 框架鉤子和行為用法實(shí)例分析
相關(guān)文章
免費(fèi)的ip數(shù)據(jù)庫淘寶IP地址庫簡介和PHP調(diào)用實(shí)例
淘寶ip地址庫提供免費(fèi)的ip信息查詢,可查詢ip所在國家、區(qū)域、省份、城市及運(yùn)營商等信息。不需要認(rèn)證不需要注冊,唯一的小缺陷就是限制美妙查詢頻率不能高于10次。2014-04-04Yii使用ajax驗(yàn)證顯示錯(cuò)誤messagebox的解決方法
這篇文章主要介紹了Yii使用ajax驗(yàn)證顯示錯(cuò)誤messagebox的解決方法,可以自行設(shè)置Ajax提示信息的方式,是非常實(shí)用的技巧,需要的朋友可以參考下2014-12-12windows7下安裝php的php-ssh2擴(kuò)展教程
這篇文章主要介紹了windows7下安裝php的php-ssh2擴(kuò)展教程,本文同時(shí)適用XP系統(tǒng),但Win8沒有測試過,需要的朋友可以參考下2014-07-07Laravel實(shí)現(xiàn)數(shù)據(jù)庫遷移與支持中文的填充
最近在學(xué)習(xí)Laravel數(shù)據(jù)庫方面的內(nèi)容,發(fā)現(xiàn)了一些資料不錯(cuò)整理出來分享給大家,下面這篇文章主要給大家介紹了關(guān)于Laravel實(shí)現(xiàn)數(shù)據(jù)庫遷移與支持中文填充的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-11-11