W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Laravel 的 event 功能提供一個簡單的觀察者實現(xiàn),允許你在應(yīng)用程序里訂閱與監(jiān)聽事件。事件類通常被保存在 app/Events
目錄下,而它們的處理程序則被保存在 app/Handlers/Events
目錄下。
你可以使用 Artisan 命令行工具產(chǎn)生一個新的事件類:
php artisan make:event PodcastWasPurchased
Laravel 里的 EventServiceProvider
提供了一個方便的地方注冊所有的事件處理程序。listen
屬性包含一個所有的事件 (鍵) 和相對應(yīng)的處理程序 (值) 的 數(shù)組。當(dāng)然,你可以依應(yīng)用程序的需求添加任何數(shù)量的事件到這個數(shù)組。舉個例子,讓我們來加上 PodcastWasPurchased
事件:
/** * 應(yīng)用程序的事件處理程序?qū)φ铡? * * @var array */protected $listen = [ 'App\Events\PodcastWasPurchased' => [ 'App\Handlers\Events\EmailPurchaseConfirmation', ],];
使用 Artisan 命令行命令 handler:event
,來產(chǎn)生一個事件的處理程序:
php artisan handler:event EmailPurchaseConfirmation --event=PodcastWasPurchased
當(dāng)然,在每次你需要一個處理程序或是事件時,手動地執(zhí)行 make:event
和 handler:event
命令很麻煩。作為替代,簡單地添加處理程序跟事件到你的 EventServiceProvider
并使用 event:generate
命令。這個命令將會產(chǎn)生任何在你的 EventServiceProvider
列出的事件跟處理程序:
php artisan event:generate
現(xiàn)在我們準(zhǔn)備好使用 Event
facade 觸發(fā)我們的事件:
$response = Event::fire(new PodcastWasPurchased($podcast));
fire
方法返回一個響應(yīng)的數(shù)組,讓你可以用來控制你的應(yīng)用程序接下來要有什么反應(yīng)。
你也可以使用 event
輔助方法來觸發(fā)事件:
event(new PodcastWasPurchased($podcast));
你甚至可以不需對事件建立對應(yīng)的處理類。舉個例子,在你的 EventServiceProvider
的 boot
方法里,你可以做下面這件事:
Event::listen('App\Events\PodcastWasPurchased', function($event){ // 處理事件...});
有時候你會希望停止繼續(xù)傳遞事件到其他監(jiān)聽器。你可以通過從處理程序返回 false
來做到這件事:
Event::listen('App\Events\PodcastWasPurchased', function($event){ // 處理事件... return false;});
需要把事件處理程序放到 隊列 嗎?這不能變得再更簡單了。當(dāng)你產(chǎn)生處理程序,簡單地使用 --queued
旗標(biāo):
php artisan handler:event SendPurchaseConfirmation --event=PodcastWasPurchased --queued
這將會產(chǎn)生一個實現(xiàn)了 Illuminate\Contracts\Queue\ShouldBeQueued
接口的處理程序類。這樣就可以了!現(xiàn)在當(dāng)這個處理程序因為事件發(fā)生被調(diào)用,它將會被事件配送器自動地排進隊列。
當(dāng)處理程序被隊列執(zhí)行,如果沒有異常被丟出,在執(zhí)行后該隊列中的任務(wù)將會自動被刪除。你也可以手動取用隊列中的任務(wù)的 delete
和 release
方法。隊列處理程序默認會引入的 Illuminate\Queue\InteractsWithQueue
trait,讓你可以取用這些方法:
public function handle(PodcastWasPurchased $event){ if (true) { $this->release(30); }}
如果你想要把一個已存在的處理程序轉(zhuǎn)換成一個隊列的處理程序,簡單地手動添加 ShouldBeQueued
接口到類。
事件訂閱者是個可以從類自身里面訂閱多個事件的類。訂閱者應(yīng)該定義 subscribe
方法,事件配送器實體將會被傳遞到這個方法:
class UserEventHandler { /** * 處理用戶登錄事件。 */ public function onUserLogin($event) { // } /** * 處理用戶注銷事件。 */ public function onUserLogout($event) { // } /** * 注冊監(jiān)聽器給訂閱者。 * * @param Illuminate\Events\Dispatcher $events * @return void */ public function subscribe($events) { $events->listen('App\Events\UserLoggedIn', 'UserEventHandler@onUserLogin'); $events->listen('App\Events\UserLoggedOut', 'UserEventHandler@onUserLogout'); }}
當(dāng)定義了訂閱者后,可以使用 Event
類注冊。
$subscriber = new UserEventHandler;Event::subscribe($subscriber);
你也可以使用 服務(wù)容器 自動解析訂閱者。簡單地傳遞訂閱者的名字給 subscribe
方法就可以做到:
Event::subscribe('UserEventHandler');
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: