




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Thinkphp事件機(jī)制兩種實(shí)現(xiàn)方式詳解目錄一、通過(guò)監(jiān)聽(tīng)二、通過(guò)訂閱1、創(chuàng)建訂閱類(lèi)2、配置監(jiān)聽(tīng)3、觸發(fā)監(jiān)聽(tīng)4、處理監(jiān)聽(tīng)邏輯4.1自動(dòng)綁定4.2手動(dòng)綁定總結(jié)事件機(jī)制的實(shí)現(xiàn)有兩種途徑:通過(guò)監(jiān)聽(tīng)、通過(guò)訂閱
一、通過(guò)監(jiān)聽(tīng)
1、創(chuàng)建監(jiān)聽(tīng)類(lèi):在命令行模式下進(jìn)入框架根目錄執(zhí)行
phpthinkmake:listener自定義的類(lèi)名
例如:
phpthinkmake:listenerUserListener
執(zhí)行之后將在框架根目錄\app\listener\下生成UserListener這個(gè)類(lèi)。
2、配置監(jiān)聽(tīng):在框架根目錄\app\event.php這個(gè)文件的listen數(shù)組中配置UserListener這個(gè)類(lèi),如下:
listen=[
testEvent=[app\listener\UserListener]
],
3、觸發(fā)監(jiān)聽(tīng):在你需要觸發(fā)監(jiān)聽(tīng)的地方加入如下代碼
event('testEvent');
注意:這里的參數(shù)testEvent即為事件名稱,可隨便定義,但必須要與在event.php文件里配置的鍵名一致。
觸發(fā)監(jiān)聽(tīng)時(shí)你可以帶上第二個(gè)參數(shù)。通過(guò)第二個(gè)參數(shù)你可以把任何數(shù)據(jù)傳遞到UserListener這個(gè)類(lèi)中,也就是handle方法的參數(shù)(不明白啥意思的結(jié)合下面的完整代碼理解)。
4、處理監(jiān)聽(tīng)邏輯:在UserListener類(lèi)的handle方法中完成業(yè)務(wù)邏輯
完整代碼如下
Other:一個(gè)用來(lái)測(cè)試的類(lèi)
php
namespaceapp\controller;
classOther
publicfunctionhello()
echo'hellofunction';
}
Index:觸發(fā)監(jiān)聽(tīng)的類(lèi)
php
namespaceapp\controller;
useapp\BaseController;
classIndexextendsBaseController
public$name='index';
publicfunctiontest1()
//觸發(fā)監(jiān)聽(tīng)事件,無(wú)參數(shù)
event('testEvent');
publicfunctiontest2()
//觸發(fā)監(jiān)聽(tīng)事件,傳遞字符串
event('testEvent','hello');
publicfunctiontest3()
//觸發(fā)監(jiān)聽(tīng)事件,傳遞自身類(lèi)
event('testEvent',$this);
publicfunctiontest4()
//觸發(fā)監(jiān)聽(tīng)事件,傳遞其他類(lèi)
$other=newOther();
event('testEvent',$other);
}
UserListener:事件監(jiān)聽(tīng)類(lèi)
php
namespaceapp\listener;
classUserListener
*事件監(jiān)聽(tīng)處理
*@returnmixed
publicfunctionhandle($event)
//當(dāng)調(diào)用Index類(lèi)的test1方法時(shí)該代碼有效,$event為null
var_dump($event);
//當(dāng)調(diào)用Index類(lèi)的test2方法時(shí)該代碼有效,$event為字符串hello
var_dump($event);
//當(dāng)調(diào)用Index類(lèi)的test3方法時(shí)該代碼有效,$event為Index類(lèi)的實(shí)例
//可以訪問(wèn)Index類(lèi)的name變量
echo$event-name;
//當(dāng)調(diào)用Index類(lèi)的test4方法時(shí)該代碼有效,$event為Other類(lèi)的實(shí)例
//可以調(diào)用Other類(lèi)的hello方法
echo$event-hello();
}
二、通過(guò)訂閱
1、創(chuàng)建訂閱類(lèi)
在命令行模式下進(jìn)入框架根目錄執(zhí)行
phpthinkmake:subscribe自定義的類(lèi)名
例如:
phpthinkmake:subscribeUserSubscribe
執(zhí)行之后將在框架根目錄\app\subscribe\下生成UserSubscribe這個(gè)類(lèi)。
2、配置監(jiān)聽(tīng)
在框架根目錄\app\event.php這個(gè)文件的subscribe數(shù)組中配置UserSubscribe這個(gè)類(lèi),如下:
subscribe=[app\subscribe\UserSubscribe],
注意:為了測(cè)試效果,要把上面配置的UserListener從listen數(shù)組刪除掉
3、觸發(fā)監(jiān)聽(tīng)
跟第一種途徑一樣
4、處理監(jiān)聽(tīng)邏輯
處理監(jiān)聽(tīng)的邏輯又有兩種方法,我稱之為自動(dòng)綁定和手動(dòng)綁定。手動(dòng)綁定和自動(dòng)綁定是互斥的,只能二選一。
4.1自動(dòng)綁定
在UserSubscribe類(lèi)中添加ontestEvent方法,在該方法中完成業(yè)務(wù)邏輯。添加的方法名不能隨意定義,規(guī)則是事件名稱前面加上on。因?yàn)槲覀冊(cè)趀vent.php里定義的事件名稱是testEvent,所以方法名就是ontestEvent(注意大小寫(xiě))。監(jiān)聽(tīng)方法定義之后就自動(dòng)與事件綁定,所以我稱之為自動(dòng)綁定。
完整代碼如下
Other和Index類(lèi)的代碼跟第一種途徑一樣
UserSubscribe:事件訂閱類(lèi)
php
namespaceapp\subscribe;
classUserSubscribe
publicfunctionontestEvent($user)
//當(dāng)調(diào)用Index類(lèi)的test1方法時(shí)該代碼有效,$event為null
var_dump($user);
//當(dāng)調(diào)用Index類(lèi)的test2方法時(shí)該代碼有效,$event為字符串hello
var_dump($user);
//當(dāng)調(diào)用Index類(lèi)的test3方法時(shí)該代碼有效,$event為Index類(lèi)的實(shí)例
//可以訪問(wèn)Index類(lèi)的name變量
echo$user-name;
//當(dāng)調(diào)用Index類(lèi)的test4方法時(shí)該代碼有效,$event為Other類(lèi)的實(shí)例
//可以調(diào)用Other類(lèi)的hello方法
echo$user-hello();
}
4.2手動(dòng)綁定
首先,創(chuàng)建事件類(lèi),負(fù)責(zé)處理具體的業(yè)務(wù)邏輯。在命令行模式下進(jìn)入框架根目錄執(zhí)行:
phpthinkmake:event自定義的類(lèi)名
例如:
phpthinkmake:eventUserEvent
執(zhí)行之后將在框架根目錄\app\event\下生成UserEvent這個(gè)類(lèi)。
再在該類(lèi)中定義一個(gè)handle方法,該方法有一個(gè)傳入?yún)?shù)。方法名和傳入的參數(shù)名可以任意定義。具體的業(yè)務(wù)邏輯就可以放在handle方法里面處理。
然后,在UserSubscribe類(lèi)中添加subscribe方法,該方法傳入?yún)?shù)為Event對(duì)象。然后在該方法中將監(jiān)聽(tīng)的事件綁定到UserEvent類(lèi)的handle方法上。如下:
$event-listen('testEvent',[app('app\event\UserEvent'),'handle']);
完整代碼如下
Other和Index類(lèi)的代碼跟第一種途徑一樣
UserSubscribe:事件訂閱類(lèi)
php
declare(strict_types=1);
namespaceapp\subscribe;
usethink\Event;
classUserSubscribe
publicfunctionsubscribe(Event$event)
$event-listen('testEvent',[app('app\event\UserEvent'),'handle']);
}
UserEvent:事件處理類(lèi)
php
declare(strict_types=1);
namespaceapp\event;
classUserEvent
publicfunctionhandle($user)
//當(dāng)調(diào)用Index類(lèi)的test1方法時(shí)該代碼有效,$user為null
var_dump($user);
//當(dāng)調(diào)用Index類(lèi)的test2方法時(shí)該代碼有效,$user為字符串hello
var_dump($user);
//當(dāng)調(diào)用Index類(lèi)的test3方法時(shí)該代碼有效,$user為Index類(lèi)的實(shí)例
//可以訪問(wèn)Index類(lèi)的name變量
echo$user-name;
//當(dāng)調(diào)用Index類(lèi)的test4方法時(shí)該代碼有效,$user為Other類(lèi)的實(shí)例
//可以調(diào)用Other類(lèi)的hello方法
echo$user-hello();
}
總結(jié)
1、通過(guò)監(jiān)聽(tīng)的方式,每個(gè)事件都需要定義一個(gè)監(jiān)聽(tīng)類(lèi)來(lái)處理監(jiān)聽(tīng)邏輯,并且在event.php的listen數(shù)組中配置
2、通過(guò)訂閱的方式,如果采用自動(dòng)綁定,則需要在訂閱類(lèi)中為每個(gè)事件定義一個(gè)監(jiān)聽(tīng)方法(方法名不能自己定義),不需要定義subscribe方法;如果采用手動(dòng)綁定,則定義subscribe方法,并為每一個(gè)事件綁定負(fù)責(zé)處理業(yè)務(wù)邏輯的具體方法(方法名可以自己定義)
3、通過(guò)監(jiān)聽(tīng)的方式中,事件類(lèi)基本上可有可無(wú),因?yàn)閯?chuàng)建的監(jiān)聽(tīng)類(lèi)本來(lái)就是專門(mén)處理對(duì)應(yīng)的事件的業(yè)務(wù)邏輯的。并且監(jiān)聽(tīng)類(lèi)可以用事件類(lèi)代替。
4、通過(guò)訂閱的方式中,如果采用自動(dòng)綁定,事件類(lèi)也沒(méi)有必要,因?yàn)樵谟嗛嗩?lèi)中為每個(gè)事件定義的監(jiān)聽(tīng)方法本來(lái)就是專門(mén)處理對(duì)應(yīng)的事件的業(yè)務(wù)邏輯的。如果采用手動(dòng)綁定,也可以把監(jiān)聽(tīng)方法寫(xiě)在訂閱類(lèi)中,那么事件類(lèi)也就沒(méi)必要了。但是個(gè)人認(rèn)為手動(dòng)綁定還是使用事件類(lèi)比較好。訂閱類(lèi)只負(fù)責(zé)綁定,事件類(lèi)負(fù)責(zé)處理具體業(yè)務(wù)邏輯,這樣結(jié)構(gòu)上比較清晰
5、其實(shí)通過(guò)監(jiān)聽(tīng)的方式中,監(jiān)聽(tīng)類(lèi)(例子中的UserListener
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 城市配送公司兼職貨運(yùn)司機(jī)服務(wù)協(xié)議
- 《變遷:家鄉(xiāng)的足跡》課件-(獲獎(jiǎng)?wù)n件)
- 醫(yī)學(xué)臨床試驗(yàn)質(zhì)量控制合作協(xié)議
- 網(wǎng)絡(luò)游戲IP改編影視作品版權(quán)授權(quán)合同
- 數(shù)據(jù)中心綠色環(huán)保建設(shè)與節(jié)能改造合同
- 企業(yè)生產(chǎn)安全培訓(xùn)課件
- 《醫(yī)療人文關(guān)懷》課件
- 《內(nèi)分泌系統(tǒng)》課件
- 《慢性疼痛與管理》課件
- 《醫(yī)療急救知識(shí)》課件
- 2025超市承包經(jīng)營(yíng)合同
- 遺產(chǎn)委托協(xié)議書(shū)范本
- (四檢)廈門(mén)市2025屆高三畢業(yè)班第四次質(zhì)量檢測(cè)英語(yǔ)試卷(含答案)
- 商務(wù)場(chǎng)景2025年商務(wù)英語(yǔ)考試試題及答案
- 人人講安全個(gè)個(gè)會(huì)應(yīng)急全國(guó)防災(zāi)減災(zāi)日主題宣教課件
- 叉車(chē)介紹課件
- 2024年Adobe設(shè)計(jì)師考試網(wǎng)頁(yè)設(shè)計(jì)重要性試題及答案
- 《激光切割技術(shù)》課件
- 2025屆深圳市高三二模英語(yǔ)試題(含答案)
- 2025年有限空間作業(yè)安全防護(hù)措施測(cè)試題庫(kù)試題
- 北京市昌平區(qū)2023-2024學(xué)年六年級(jí)下學(xué)期語(yǔ)文期末畢業(yè)考試試卷(含答案)
評(píng)論
0/150
提交評(píng)論