下面由thinkphp教程欄目給大家介紹tp5框架中的hook機制,希望對需要的朋友有所幫助!
1. 官方解釋
行為(Behavior)是ThinkPHP擴展機制中比較關(guān)鍵的一項擴展,行為既可以獨立調(diào)用,也可以綁定到某個標簽中進行偵聽,在官方提出的CBD模式中行為也占了主要的地位,可見行為在ThinkPHP框架中意義非凡。
2. TP5自帶鉤子(TP框架中已經(jīng)埋好標簽,我們只要配置實現(xiàn)相應(yīng)的函數(shù)就可以用了)
- app_init 應(yīng)用初始化標簽位,在thinkApp.php的initCommon函數(shù)中Hook::listen(‘a(chǎn)pp_init’);沒有接收參數(shù)。
- app_begin應(yīng)用開始標簽位,在thinkApp.php的run函數(shù)中,在加載路由和請求信息后執(zhí)行。會接收一個參數(shù),存儲的是本次請求的調(diào)度信息。
- module_init 模塊初始化標簽位,在thinkApp.php的module函數(shù)中,在加載請求控制器之前執(zhí)行,接收一個參數(shù),存儲請求信息。
- action_init 控制器開始標簽位,在thinkApp.php的module函數(shù)中,在加載完控制器后,使用反射請求控制器之前執(zhí)行。接收一個參數(shù),是一個數(shù)組,第一個元素是請求控制器實例對象,第二個函數(shù)時要執(zhí)行的控制器函數(shù)名。
- view_fileter 視圖輸出過濾標簽位,在thinkView.php的fetch函數(shù)中,接收一個參數(shù),視圖字符串。
- app_end 應(yīng)用結(jié)束標簽為,在thinkApp.php中run函數(shù)中,Hook::listen(‘a(chǎn)pp_end’);
- log_write 日志write方法標簽位,在調(diào)用Log::wirte記錄日志之前執(zhí)行。接收一個參數(shù),要寫入的日志信息。
- response_end 響應(yīng)結(jié)束標簽為。在thinkResponse.php的send函數(shù)中,在響應(yīng)客戶端請求之后執(zhí)行。
3. 鉤子函數(shù)的注冊和監(jiān)聽都依賴于thinkHook.php
4. 系統(tǒng)只帶的鉤子函數(shù),我們可以在applicationtags.php中注冊,也可以使用Hook::add()來添加。
>?1.?官方文檔數(shù)tags.php會自動加載,但是經(jīng)測試我下載的tp5不會自動加載tags.php文件,所以就手動在thinkstart.php文件的App::run()->send();函數(shù)之前寫了一行代碼用于,注冊tags文件中的鉤子實現(xiàn)。代碼為 "php ????//?加載Hook ????Hook::import(require?APP_PATH?.?'/tags.php'); " >?2.?也可以使用Hook::add和Hook::listen來添加自己的鉤子函數(shù)。Hook::listen()相當于是標簽位,Hook::add()則相當于是對標簽位相應(yīng)的實現(xiàn)。所以要確保Hook::add()在Hoo::listen之前執(zhí)行,不然就沒什么用處了。
5. 鉤子函數(shù)的綁定。
鉤子函數(shù)既可以單獨綁定一個類,也可以綁定類中的一個方法,或者直接綁定一個匿名函數(shù)。當綁定到一個類時,如果類中有run函數(shù),那就直接執(zhí)行run函數(shù),如果沒有run函數(shù),而有一個與鉤子名一樣的函數(shù)則會執(zhí)行該函數(shù)。(注意:鉤子函數(shù)是駝峰式命名,并且鉤子函數(shù)名的優(yōu)先級大于run函數(shù)的優(yōu)先級)
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載。
THE END