事件
基本用法
Laravel 的事件功能提供了一个简单的观察者实现,允许您在应用程序中订阅和监听事件。事件类通常存储在 app/Events
目录中,而它们的处理器存储在 app/Handlers/Events
中。
您可以使用 Artisan CLI 工具生成一个新的事件类:
php artisan make:event PodcastWasPurchased
订阅事件
Laravel 应用程序中包含的 EventServiceProvider
提供了一个方便的地方来注册所有事件处理器。listen
属性包含一个所有事件(键)及其处理器(值)的数组。当然,您可以根据应用程序的需要向此数组添加任意数量的事件。例如,让我们添加我们的 PodcastWasPurchased
事件:
/**
* 应用程序的事件处理器映射。
*
* @var array
*/
protected $listen = [
'App\Events\PodcastWasPurchased' => [
'App\Handlers\Events\EmailPurchaseConfirmation',
],
];
要为事件生成处理器,请使用 handler:event
Artisan CLI 命令:
php artisan handler:event EmailPurchaseConfirmation --event=PodcastWasPurchased
当然,每次需要处理器或事件时手动运行 make:event
和 handler:event
命令是很麻烦的。相反,只需将处理器和事件添加到您的 EventServiceProvider
中,并使用 event:generate
命令。此命令将生成在您的 EventServiceProvider
中列出的任何事件或处理器:
php artisan event:generate
触发事件
现在我们可以使用 Event
facade 触发我们的事件:
$response = Event::fire(new PodcastWasPurchased($podcast));
fire
方法返回一个响应数组,您可以使用它来控制应用程序接下来的操作。
您也可以使用 event
辅助函数来触发事件:
event(new PodcastWasPurchased($podcast));
闭包监听器
您甚至可以在不创建单独的处理器类的情况下监听事件。例如,在您的 EventServiceProvider
的 boot
方法中,您可以这样做:
Event::listen('App\Events\PodcastWasPurchased', function($event)
{
// 处理事件...
});
停止事件传播
有时,您可能希望停止事件向其他监听器的传播。您可以通过从处理器返回 false
来实现:
Event::listen('App\Events\PodcastWasPurchased', function($event)
{
// 处理事件...
return false;
});
队列事件处理器
需要将事件处理器 队列 吗?这再简单不过了。在生成处理器时,只需使用 --queued
标志:
php artisan handler:event SendPurchaseConfirmation --event=PodcastWasPurchased --queued
这将生成一个实现 Illuminate\Contracts\Queue\ShouldBeQueued
接口的处理器类。就是这样!现在,当事件调度器调用此处理器时,它将自动排队。
如果在队列执行处理器时没有抛出异常,队列作业将在处理后自动删除。如果您需要手动访问队列作业的 delete
和 release
方法,可以这样做。默认情况下,队列处理器中包含的 Illuminate\Queue\InteractsWithQueue
trait 为您提供了这些方法的访问权限:
public function handle(PodcastWasPurchased $event)
{
if (true)
{
$this->release(30);
}
}
如果您有一个现有的处理器想要转换为队列处理器,只需手动将 ShouldBeQueued
接口添加到类中。
事件订阅者
定义事件订阅者
事件订阅者是可以在类内部订阅多个事件的类。订阅者应定义一个 subscribe
方法,该方法将传递一个事件调度器实例:
class UserEventHandler {
/**
* 处理用户登录事件。
*/
public function onUserLogin($event)
{
//
}
/**
* 处理用户注销事件。
*/
public function onUserLogout($event)
{
//
}
/**
* 为订阅者注册监听器。
*
* @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');
}
}
注册事件订阅者
定义订阅者后,可以使用 Event
类注册它。
$subscriber = new UserEventHandler;
Event::subscribe($subscriber);
您还可以使用 服务容器 来解析您的订阅者。为此,只需将订阅者的名称传递给 subscribe
方法:
Event::subscribe('UserEventHandler');