Skip to content

事件

基本用法

Laravel 的事件功能提供了一个简单的观察者实现,允许您在应用程序中订阅和监听事件。事件类通常存储在 app/Events 目录中,而它们的处理器存储在 app/Handlers/Events 中。

您可以使用 Artisan CLI 工具生成一个新的事件类:

php
php artisan make:event PodcastWasPurchased

订阅事件

Laravel 应用程序中包含的 EventServiceProvider 提供了一个方便的地方来注册所有事件处理器。listen 属性包含一个所有事件(键)及其处理器(值)的数组。当然,您可以根据应用程序的需要向此数组添加任意数量的事件。例如,让我们添加我们的 PodcastWasPurchased 事件:

php
/**
 * 应用程序的事件处理器映射。
 *
 * @var array
 */
protected $listen = [
	'App\Events\PodcastWasPurchased' => [
		'App\Handlers\Events\EmailPurchaseConfirmation',
	],
];

要为事件生成处理器,请使用 handler:event Artisan CLI 命令:

php
php artisan handler:event EmailPurchaseConfirmation --event=PodcastWasPurchased

当然,每次需要处理器或事件时手动运行 make:eventhandler:event 命令是很麻烦的。相反,只需将处理器和事件添加到您的 EventServiceProvider 中,并使用 event:generate 命令。此命令将生成在您的 EventServiceProvider 中列出的任何事件或处理器:

php
php artisan event:generate

触发事件

现在我们可以使用 Event facade 触发我们的事件:

php
$response = Event::fire(new PodcastWasPurchased($podcast));

fire 方法返回一个响应数组,您可以使用它来控制应用程序接下来的操作。

您也可以使用 event 辅助函数来触发事件:

php
event(new PodcastWasPurchased($podcast));

闭包监听器

您甚至可以在不创建单独的处理器类的情况下监听事件。例如,在您的 EventServiceProviderboot 方法中,您可以这样做:

php
Event::listen('App\Events\PodcastWasPurchased', function($event)
{
	// 处理事件...
});

停止事件传播

有时,您可能希望停止事件向其他监听器的传播。您可以通过从处理器返回 false 来实现:

php
Event::listen('App\Events\PodcastWasPurchased', function($event)
{
	// 处理事件...

	return false;
});

队列事件处理器

需要将事件处理器 队列 吗?这再简单不过了。在生成处理器时,只需使用 --queued 标志:

php
php artisan handler:event SendPurchaseConfirmation --event=PodcastWasPurchased --queued

这将生成一个实现 Illuminate\Contracts\Queue\ShouldBeQueued 接口的处理器类。就是这样!现在,当事件调度器调用此处理器时,它将自动排队。

如果在队列执行处理器时没有抛出异常,队列作业将在处理后自动删除。如果您需要手动访问队列作业的 deleterelease 方法,可以这样做。默认情况下,队列处理器中包含的 Illuminate\Queue\InteractsWithQueue trait 为您提供了这些方法的访问权限:

php
public function handle(PodcastWasPurchased $event)
{
	if (true)
	{
		$this->release(30);
	}
}

如果您有一个现有的处理器想要转换为队列处理器,只需手动将 ShouldBeQueued 接口添加到类中。

事件订阅者

定义事件订阅者

事件订阅者是可以在类内部订阅多个事件的类。订阅者应定义一个 subscribe 方法,该方法将传递一个事件调度器实例:

php
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 类注册它。

php
$subscriber = new UserEventHandler;

Event::subscribe($subscriber);

您还可以使用 服务容器 来解析您的订阅者。为此,只需将订阅者的名称传递给 subscribe 方法:

php
Event::subscribe('UserEventHandler');