Thinkphp事件機(jī)制兩種實(shí)現(xiàn)方式詳解_第1頁(yè)
Thinkphp事件機(jī)制兩種實(shí)現(xiàn)方式詳解_第2頁(yè)
Thinkphp事件機(jī)制兩種實(shí)現(xiàn)方式詳解_第3頁(yè)
Thinkphp事件機(jī)制兩種實(shí)現(xiàn)方式詳解_第4頁(yè)
Thinkphp事件機(jī)制兩種實(shí)現(xiàn)方式詳解_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論