本文以實例的形式詳細介紹了ThinkPHP的行為擴展Behavior的實現方法,有助於讀者更靈活的掌握ThinkPHP的開發,具體步驟如下:
ThinkPHP 行為擴展 (Behavior) 流程:
最先是讀取配置文件信息:
$mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';
讀取配置文件信息 ThinkPHP\Mode\common.php
// 行為擴展定義 'tags' => array( 'app_init' => array( ), 'app_begin' => array( 'Behavior\ReadHtmlCache', // 讀取靜態緩存 ), 'app_end' => array( 'Behavior\ShowPageTrace', // 頁面Trace顯示 ), 'path_info' => array(), 'action_begin' => array(), 'action_end' => array(), 'view_begin' => array(), 'view_parse' => array( 'Behavior\ParseTemplate', // 模板解析 支持PHP、內置模板引擎和第三方模板引擎 ), 'template_filter'=> array( 'Behavior\ContentReplace', // 模板輸出替換 ), 'view_filter' => array( 'Behavior\WriteHtmlCache', // 寫入靜態緩存 ), 'view_end' => array(), ),
默認調用了系統行為擴展:靜態緩存讀取 、頁面Trace顯示輸出、模板解析、模板內容輸出替換、靜態緩存寫入
// 加載模式行為定義 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');
分別用Hook去加載 系統行為和自定義行為,並把配置信息保存到 Hook 私有屬性$tags中
ThinkPHP\Library\Think\Think.class.php 初始化完成後會調用App::run();
ThinkPHP\Library\Think\App.class.php文件如下:
/** * 運行應用實例 入口文件使用的快捷方法 * @access public * @return void */ static public function run() { // 應用初始化標簽 Hook::listen('app_init'); App::init(); // 應用開始標簽 Hook::listen('app_begin'); // Session初始化 if(!IS_CLI){ session(C('SESSION_OPTIONS')); } // 記錄應用初始化時間 G('initTime'); App::exec(); // 應用結束標簽 Hook::listen('app_end'); return ; }
可以看出程序在App init之前 通過鉤子去監聽(查看)此動作時是否有需要處理的。循環$tags['app_init']獲取類名並通過類名自動執行行為擴展類run方法
所有鉤子如下:
'url_dispatch' // URL調度結束標簽 'app_init' // 應用初始化標簽 'app_begin' // 應用開始標簽 'app_end' // 應用結束標簽 'action_begin' // 動作執行前操作 'action_end' // 動作執行後操作 'ajax_return' // 用於擴展其他返回格式數據 'path_info' // 檢測路由規則 如果沒有則按默認規則調度URL 'template_filter' // 模版編譯過濾標簽 'view_begin' // 視圖開始標簽 'view_end' // 視圖結束標簽 'view_parse' // 視圖解析標簽 'view_filter' // 內容過濾標簽
缺點如下:
1.順序不可控(配置文件沒有專門的參數去控制順序)如app_init同時有2個監控時先調用哪個方法。
2.監控不是全局監控內部寫的太死只有一些定義好的不能通過配置文件去自動控制每一個操作的鉤子(可能是考慮到性能才沒有加)
優點如下:
1.可以實現了好多行為擴展
2.可以代理檢測、浏覽器防刷新檢測、操作路由檢測等
總結:
行為擴展就是在 程序某個操作時去額外的去執行某一特定功能。如程序在操作數據庫 讀的時候 通過explian獲取性能信息並監測性能瓶頸 如出現獲取數據時超過特定秒數 就把相關信息email給項目經理等。