




版權(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)建訂閱類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)類:在命令行模式下進(jìn)入框架根目錄執(zhí)行
phpthinkmake:listener自定義的類名
例如:
phpthinkmake:listenerUserListener
執(zhí)行之后將在框架根目錄\app\listener\下生成UserListener這個(gè)類。
2、配置監(jiān)聽(tīng):在框架根目錄\app\event.php這個(gè)文件的listen數(shù)組中配置UserListener這個(gè)類,如下:
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è)類中,也就是handle方法的參數(shù)(不明白啥意思的結(jié)合下面的完整代碼理解)。
4、處理監(jiān)聽(tīng)邏輯:在UserListener類的handle方法中完成業(yè)務(wù)邏輯
完整代碼如下
Other:一個(gè)用來(lái)測(cè)試的類
php
namespaceapp\controller;
classOther
publicfunctionhello()
echo'hellofunction';
}
Index:觸發(fā)監(jiān)聽(tīng)的類
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)事件,傳遞自身類
event('testEvent',$this);
publicfunctiontest4()
//觸發(fā)監(jiān)聽(tīng)事件,傳遞其他類
$other=newOther();
event('testEvent',$other);
}
UserListener:事件監(jiān)聽(tīng)類
php
namespaceapp\listener;
classUserListener
*事件監(jiān)聽(tīng)處理
*@returnmixed
publicfunctionhandle($event)
//當(dāng)調(diào)用Index類的test1方法時(shí)該代碼有效,$event為null
var_dump($event);
//當(dāng)調(diào)用Index類的test2方法時(shí)該代碼有效,$event為字符串hello
var_dump($event);
//當(dāng)調(diào)用Index類的test3方法時(shí)該代碼有效,$event為Index類的實(shí)例
//可以訪問(wèn)Index類的name變量
echo$event-name;
//當(dāng)調(diào)用Index類的test4方法時(shí)該代碼有效,$event為Other類的實(shí)例
//可以調(diào)用Other類的hello方法
echo$event-hello();
}
二、通過(guò)訂閱
1、創(chuàng)建訂閱類
在命令行模式下進(jìn)入框架根目錄執(zhí)行
phpthinkmake:subscribe自定義的類名
例如:
phpthinkmake:subscribeUserSubscribe
執(zhí)行之后將在框架根目錄\app\subscribe\下生成UserSubscribe這個(gè)類。
2、配置監(jiān)聽(tīng)
在框架根目錄\app\event.php這個(gè)文件的subscribe數(shù)組中配置UserSubscribe這個(gè)類,如下:
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類中添加ontestEvent方法,在該方法中完成業(yè)務(wù)邏輯。添加的方法名不能隨意定義,規(guī)則是事件名稱前面加上on。因?yàn)槲覀冊(cè)趀vent.php里定義的事件名稱是testEvent,所以方法名就是ontestEvent(注意大小寫(xiě))。監(jiān)聽(tīng)方法定義之后就自動(dòng)與事件綁定,所以我稱之為自動(dòng)綁定。
完整代碼如下
Other和Index類的代碼跟第一種途徑一樣
UserSubscribe:事件訂閱類
php
namespaceapp\subscribe;
classUserSubscribe
publicfunctionontestEvent($user)
//當(dāng)調(diào)用Index類的test1方法時(shí)該代碼有效,$event為null
var_dump($user);
//當(dāng)調(diào)用Index類的test2方法時(shí)該代碼有效,$event為字符串hello
var_dump($user);
//當(dāng)調(diào)用Index類的test3方法時(shí)該代碼有效,$event為Index類的實(shí)例
//可以訪問(wèn)Index類的name變量
echo$user-name;
//當(dāng)調(diào)用Index類的test4方法時(shí)該代碼有效,$event為Other類的實(shí)例
//可以調(diào)用Other類的hello方法
echo$user-hello();
}
4.2手動(dòng)綁定
首先,創(chuàng)建事件類,負(fù)責(zé)處理具體的業(yè)務(wù)邏輯。在命令行模式下進(jìn)入框架根目錄執(zhí)行:
phpthinkmake:event自定義的類名
例如:
phpthinkmake:eventUserEvent
執(zhí)行之后將在框架根目錄\app\event\下生成UserEvent這個(gè)類。
再在該類中定義一個(gè)handle方法,該方法有一個(gè)傳入?yún)?shù)。方法名和傳入的參數(shù)名可以任意定義。具體的業(yè)務(wù)邏輯就可以放在handle方法里面處理。
然后,在UserSubscribe類中添加subscribe方法,該方法傳入?yún)?shù)為Event對(duì)象。然后在該方法中將監(jiān)聽(tīng)的事件綁定到UserEvent類的handle方法上。如下:
$event-listen('testEvent',[app('app\event\UserEvent'),'handle']);
完整代碼如下
Other和Index類的代碼跟第一種途徑一樣
UserSubscribe:事件訂閱類
php
declare(strict_types=1);
namespaceapp\subscribe;
usethink\Event;
classUserSubscribe
publicfunctionsubscribe(Event$event)
$event-listen('testEvent',[app('app\event\UserEvent'),'handle']);
}
UserEvent:事件處理類
php
declare(strict_types=1);
namespaceapp\event;
classUserEvent
publicfunctionhandle($user)
//當(dāng)調(diào)用Index類的test1方法時(shí)該代碼有效,$user為null
var_dump($user);
//當(dāng)調(diào)用Index類的test2方法時(shí)該代碼有效,$user為字符串hello
var_dump($user);
//當(dāng)調(diào)用Index類的test3方法時(shí)該代碼有效,$user為Index類的實(shí)例
//可以訪問(wèn)Index類的name變量
echo$user-name;
//當(dāng)調(diào)用Index類的test4方法時(shí)該代碼有效,$user為Other類的實(shí)例
//可以調(diào)用Other類的hello方法
echo$user-hello();
}
總結(jié)
1、通過(guò)監(jiān)聽(tīng)的方式,每個(gè)事件都需要定義一個(gè)監(jiān)聽(tīng)類來(lái)處理監(jiān)聽(tīng)邏輯,并且在event.php的listen數(shù)組中配置
2、通過(guò)訂閱的方式,如果采用自動(dòng)綁定,則需要在訂閱類中為每個(gè)事件定義一個(gè)監(jiān)聽(tīng)方法(方法名不能自己定義),不需要定義subscribe方法;如果采用手動(dòng)綁定,則定義subscribe方法,并為每一個(gè)事件綁定負(fù)責(zé)處理業(yè)務(wù)邏輯的具體方法(方法名可以自己定義)
3、通過(guò)監(jiān)聽(tīng)的方式中,事件類基本上可有可無(wú),因?yàn)閯?chuàng)建的監(jiān)聽(tīng)類本來(lái)就是專門(mén)處理對(duì)應(yīng)的事件的業(yè)務(wù)邏輯的。并且監(jiān)聽(tīng)類可以用事件類代替。
4、通過(guò)訂閱的方式中,如果采用自動(dòng)綁定,事件類也沒(méi)有必要,因?yàn)樵谟嗛嗩愔袨槊總€(gè)事件定義的監(jiān)聽(tīng)方法本來(lái)就是專門(mén)處理對(duì)應(yīng)的事件的業(yè)務(wù)邏輯的。如果采用手動(dòng)綁定,也可以把監(jiān)聽(tīng)方法寫(xiě)在訂閱類中,那么事件類也就沒(méi)必要了。但是個(gè)人認(rèn)為手動(dòng)綁定還是使用事件類比較好。訂閱類只負(fù)責(zé)綁定,事件類負(fù)責(zé)處理具體業(yè)務(wù)邏輯,這樣結(jié)構(gòu)上比較清晰
5、其實(shí)通過(guò)監(jiān)聽(tīng)的方式中,監(jiān)聽(tīng)類(例子中的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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園膳食委員會(huì)會(huì)議記錄
- 廚余垃圾智能收運(yùn)處置系統(tǒng)項(xiàng)目可行性分析
- 商鋪?zhàn)夥亢贤瑓f(xié)議書(shū)
- 更換合同協(xié)議書(shū)
- 解除借錢(qián)合同協(xié)議書(shū)
- 樓頂防水合同協(xié)議書(shū)范本
- 林地合同終止協(xié)議書(shū)范本
- 打印店合同協(xié)議書(shū)
- 復(fù)婚合同協(xié)議書(shū)
- 畫(huà)室宿管合同協(xié)議書(shū)
- 【工程法規(guī)】王欣 教材精講班課件 39-第6章-6.4-施工現(xiàn)場(chǎng)安全防護(hù)制度
- 重難點(diǎn)18 球的切、接問(wèn)題(舉一反三)(新高考專用)(教師版) 2025年高考數(shù)學(xué)一輪復(fù)習(xí)專練(新高考專用)
- 【產(chǎn)業(yè)圖譜】2024年廣州市重點(diǎn)產(chǎn)業(yè)規(guī)劃布局全景圖譜(附各地區(qū)重點(diǎn)產(chǎn)業(yè)、產(chǎn)業(yè)體系布局、未來(lái)產(chǎn)業(yè)發(fā)展規(guī)劃等)
- 2024年云南省昆明市盤(pán)龍區(qū)小升初英語(yǔ)試卷
- GB/Z 44314-2024生物技術(shù)生物樣本保藏動(dòng)物生物樣本保藏要求
- 溫室大棚鋼結(jié)構(gòu)安裝方案
- 2024-2030年中國(guó)寵物殯葬服務(wù)行業(yè)市場(chǎng)深度調(diào)研及發(fā)展戰(zhàn)略與投資前景研究報(bào)告
- 人工智能賦能語(yǔ)文教育的創(chuàng)新發(fā)展研究
- 2020-2021年全國(guó)小升初語(yǔ)文真題匯編專題03字形(解析版)
- 單片機(jī)原理及應(yīng)用智慧樹(shù)知到期末考試答案章節(jié)答案2024年溫州醫(yī)科大學(xué)
- 《中國(guó)心力衰竭診斷和治療指南2024》解讀(總)
評(píng)論
0/150
提交評(píng)論