thinkphp5.1 框架鉤子和行為用法實(shí)例分析
本文實(shí)例講述了thinkphp5.1 框架鉤子和行為用法。分享給大家供大家參考,具體如下:
行為
ThinkPHP中的行為是一個(gè)比較抽象的概念,可以把行為想象成在應(yīng)用執(zhí)行過(guò)程中的一個(gè)動(dòng)作。
在框架的執(zhí)行流程中,例如路由檢測(cè)是一個(gè)行為,靜態(tài)緩存是一個(gè)行為,用戶權(quán)限檢測(cè)也是行為,大到業(yè)務(wù)邏輯,小到瀏覽器檢測(cè)、多語(yǔ)言檢測(cè)等等都可以當(dāng)做是一個(gè)行為,甚至說(shuō)你希望給你的網(wǎng)站用戶的第一次訪問(wèn)彈出Hello,world!這些都可以看成是一種行為,把這些行為抽離出來(lái)的目的是為了讓你無(wú)需改動(dòng)框架和應(yīng)用,而在外圍通過(guò)擴(kuò)展或者配置來(lái)改變或者增加一些功能。
鉤子
不同的行為之間也具有位置共同性,比如,有些行為的作用位置都是在應(yīng)用執(zhí)行前,有些行為都是在模板輸出之后,我們把這些行為發(fā)生作用的位置稱之為鉤子
當(dāng)應(yīng)用程序運(yùn)行到這個(gè)鉤子的時(shí)候,就會(huì)被攔截下來(lái),統(tǒng)一執(zhí)行相關(guān)的行為
一個(gè)鉤子可以注冊(cè)多個(gè)行為,執(zhí)行到某個(gè)鉤子位置后,會(huì)按照注冊(cè)的順序依次執(zhí)行相關(guān)的行為。但在某些特殊的情況下,你可以設(shè)置某個(gè)鉤子只能執(zhí)行一次行為,又或者你可以在一個(gè)鉤子的某個(gè)行為中返回false
來(lái)強(qiáng)制終止后續(xù)的行為執(zhí)行;一個(gè)行為可以同時(shí)注冊(cè)到多個(gè)不同的鉤子上,完全看應(yīng)用的需求來(lái)設(shè)計(jì)。
設(shè)置鉤子:
Hook::listen('鉤子名稱','參數(shù)','是否只有一次有效返回值');
除了鉤子名稱之外,其它參數(shù)都是可選的,注意5.1版本第二個(gè)參數(shù)不支持引用傳值。
行為定義
行為類的定義很簡(jiǎn)單,一般來(lái)說(shuō)只需要定義一個(gè)行為入口方法run
即可
可以在行為方法中使用依賴注入
行為類并不需要繼承任何類,相對(duì)比較靈活。如果行為類需要綁定到多個(gè)鉤子,可以定義多個(gè)方法
行為綁定
行為定義完成后,就需要綁定到某個(gè)標(biāo)簽位置才能生效,否則是不會(huì)執(zhí)行的。
使用think\facade\Hook類的add方法注冊(cè)行為,例如:
// 注冊(cè) app\index\behavior\CheckLang行為類到app_init標(biāo)簽位 Hook::add('app_init','app\\index\\behavior\\CheckLang'); //注冊(cè) app\admin\behavior\CronRun行為類到app_init標(biāo)簽位 Hook::add('app_init','app\\admin\\behavior\\CronRun');
如果要批量注冊(cè)行為的話,可以使用:
Hook::add('app_init',['app\\index\\behavior\\CheckAuth','app\\index\\behavior\\CheckLang','app\\admin\\behavior\\Cr
當(dāng)應(yīng)用運(yùn)行到app_init標(biāo)簽位的時(shí)候,就會(huì)依次調(diào)用app\index\behavior\CheckAuth、app\index\behavior\CheckLang和app\admin\behavior\CronRun行為。如果其中一個(gè)行為中有中止代碼的話則后續(xù)不會(huì)執(zhí)行,如果返回false
則當(dāng)前標(biāo)簽位的后續(xù)行為將不會(huì)執(zhí)行,但應(yīng)用將繼續(xù)運(yùn)行。
閉包支持
可以不用定義行為直接把閉包函數(shù)綁定到某個(gè)標(biāo)簽位,例如:
Hook::add('app_init',function(){ echo 'Hello,world!'; });
如果標(biāo)簽位有傳入?yún)?shù)的話,閉包也可以支持傳入?yún)?shù),例如:
Hook::listen('action_init',$params); Hook::add('action_init',function($params){ var_dump($params); });
直接執(zhí)行行為
如果需要,也可以不綁定行為標(biāo)簽,直接調(diào)用某個(gè)行為,使用:
// 執(zhí)行 app\index\behavior\CheckAuth行為類的run方法 并引用傳入params參數(shù) $result = Hook::exec('app\\index\\behavior\\CheckAuth',$params);
直接執(zhí)行行為的時(shí)候,執(zhí)行的是run方法,如果需要執(zhí)行行為類的其它方法,可以使用
// 執(zhí)行 app\index\behavior\CheckAuth行為類的hello方法 并引用傳入params參數(shù) $result = Hook::exec(['app\\index\\behavior\\CheckAuth','hello'], $params);
更多關(guān)于thinkPHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《ThinkPHP入門教程》、《thinkPHP模板操作技巧總結(jié)》、《ThinkPHP常用方法總結(jié)》、《codeigniter入門教程》、《CI(CodeIgniter)框架進(jìn)階教程》、《Zend FrameWork框架入門教程》及《PHP模板技術(shù)總結(jié)》。
希望本文所述對(duì)大家基于ThinkPHP框架的PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP對(duì)接阿里云虛擬號(hào)的實(shí)現(xiàn)(號(hào)碼隱私保護(hù))
這篇文章主要介紹了PHP對(duì)接阿里云虛擬號(hào)的實(shí)現(xiàn)(號(hào)碼隱私保護(hù)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03PHP封裝的遠(yuǎn)程抓取網(wǎng)站圖片并保存功能類
這篇文章主要介紹了PHP封裝的遠(yuǎn)程抓取網(wǎng)站圖片并保存功能類,結(jié)合實(shí)例形式分析了php抓取遠(yuǎn)程圖片封裝類的定義與簡(jiǎn)單使用方法,涉及php正則匹配與文件讀寫(xiě)相關(guān)操作技巧,需要的朋友可以參考下2018-06-06學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)狀態(tài)模式
這篇文章主要介紹了php設(shè)計(jì)模式中的狀態(tài)模式,使用php實(shí)現(xiàn)狀態(tài)模式,感興趣的小伙伴們可以參考一下2015-12-12php 遍歷顯示文件夾下所有目錄、所有文件的函數(shù),沒(méi)有分頁(yè)的代碼
一個(gè)簡(jiǎn)單的目錄遞歸函數(shù) 第一種實(shí)現(xiàn)辦法:用dir返回對(duì)象 第二種實(shí)現(xiàn)辦法:用readdir()函數(shù)2008-11-11PHP實(shí)現(xiàn)無(wú)限極分類的兩種方式示例【遞歸和引用方式】
這篇文章主要介紹了PHP實(shí)現(xiàn)無(wú)限極分類的兩種方式,結(jié)合實(shí)例形式分析了php基于遞歸和引用方式進(jìn)行數(shù)組遍歷的相關(guān)操作技巧,需要的朋友可以參考下2019-03-03幾個(gè)優(yōu)化WordPress中JavaScript加載體驗(yàn)的插件介紹
這篇文章主要介紹了幾個(gè)優(yōu)化WordPress中JavaScript加載體驗(yàn)的插件,一般來(lái)說(shuō)在WordPress中加載JavaScript最好使用wp_enqueue_script()函數(shù)以減少問(wèn)題提高效率,需要的朋友可以參考下2015-12-12PHP實(shí)現(xiàn)一個(gè)按鈕點(diǎn)擊上傳多個(gè)圖片操作示例
這篇文章主要介紹了PHP實(shí)現(xiàn)一個(gè)按鈕點(diǎn)擊上傳多個(gè)圖片操作,結(jié)合具體實(shí)例形式分析了PHP多文件上傳前端提交與后臺(tái)處理相關(guān)操作技巧,需要的朋友可以參考下2020-01-01