Skip to content

事件

基本用法

Laravel 的 Event 类提供了一个简单的观察者实现,允许您在应用程序中订阅和监听事件。

订阅事件

php
Event::listen('auth.login', function($user)
{
	$user->last_login = new DateTime;

	$user->save();
});

触发事件

php
$response = Event::fire('auth.login', array($user));

fire 方法返回一个响应数组,您可以使用它来控制接下来发生的事情。

带优先级的事件订阅

您还可以在订阅事件时指定优先级。优先级较高的监听器将首先运行,而具有相同优先级的监听器将按订阅顺序运行。

php
Event::listen('auth.login', 'LoginHandler', 10);

Event::listen('auth.login', 'OtherHandler', 5);

停止事件传播

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

php
Event::listen('auth.login', function($event)
{
	// 处理事件...

	return false;
});

注册事件的位置

所以,您知道如何注册事件,但您可能想知道 在哪里 注册它们。别担心,这是一个常见的问题。不幸的是,这是一个很难回答的问题,因为您几乎可以在任何地方注册事件!但是,这里有一些提示。再次强调,就像大多数其他引导代码一样,您可以在 start 文件中注册事件,例如 app/start/global.php

如果您的 start 文件变得太拥挤,您可以创建一个单独的 app/events.php 文件,并从 start 文件中包含它。这是一个简单的解决方案,可以将事件注册与其他引导代码清晰地分开。

如果您更喜欢基于类的方法,您可以在 服务提供者 中注册事件。由于这些方法没有一个是“正确的”,请选择您根据应用程序的大小感到舒适的方法。

通配符监听器

注册通配符事件监听器

在注册事件监听器时,您可以使用星号来指定通配符监听器:

php
Event::listen('foo.*', function($param)
{
	// 处理事件...
});

此监听器将处理所有以 foo. 开头的事件。

您可以使用 Event::firing 方法来确定确切触发了哪个事件:

php
Event::listen('foo.*', function($param)
{
	if (Event::firing() == 'foo.bar')
	{
		//
	}
});

使用类作为监听器

在某些情况下,您可能希望使用类来处理事件,而不是使用闭包。类事件监听器将从 Laravel IoC 容器 中解析,提供您在监听器上使用依赖注入的全部功能。

注册类监听器

php
Event::listen('auth.login', 'LoginHandler');

定义事件监听器类

默认情况下,将调用 LoginHandler 类上的 handle 方法:

php
class LoginHandler {

	public function handle($data)
	{
		//
	}

}

指定要订阅的方法

如果您不想使用默认的 handle 方法,您可以指定应该订阅的方法:

php
Event::listen('auth.login', 'LoginHandler@onLogin');

队列事件

注册队列事件

使用 queueflush 方法,您可以“排队”一个事件以供触发,但不立即触发:

php
Event::queue('foo', array($user));

您可以使用 flush 方法运行“冲刷器”并冲刷所有排队的事件:

php
Event::flush('foo');

事件订阅者

定义事件订阅者

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

php
class UserEventHandler {

	/**
	 * 处理用户登录事件。
	 */
	public function onUserLogin($event)
	{
		//
	}

	/**
	 * 处理用户注销事件。
	 */
	public function onUserLogout($event)
	{
		//
	}

	/**
	 * 注册订阅者的监听器。
	 *
	 * @param  Illuminate\Events\Dispatcher  $events
	 * @return array
	 */
	public function subscribe($events)
	{
		$events->listen('auth.login', 'UserEventHandler@onUserLogin');

		$events->listen('auth.logout', 'UserEventHandler@onUserLogout');
	}

}

注册事件订阅者

一旦定义了订阅者,就可以使用 Event 类注册它。

php
$subscriber = new UserEventHandler;

Event::subscribe($subscriber);

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

php
Event::subscribe('UserEventHandler');