事件
基本用法
Laravel 的 Event
类提供了一个简单的观察者实现,允许您在应用程序中订阅和监听事件。
订阅事件
Event::listen('auth.login', function($user)
{
$user->last_login = new DateTime;
$user->save();
});
触发事件
$response = Event::fire('auth.login', array($user));
fire
方法返回一个响应数组,您可以使用它来控制接下来发生的事情。
带优先级的事件订阅
您还可以在订阅事件时指定优先级。优先级较高的监听器将首先运行,而具有相同优先级的监听器将按订阅顺序运行。
Event::listen('auth.login', 'LoginHandler', 10);
Event::listen('auth.login', 'OtherHandler', 5);
停止事件传播
有时,您可能希望停止事件传播到其他监听器。您可以通过从监听器返回 false
来实现:
Event::listen('auth.login', function($event)
{
// 处理事件...
return false;
});
注册事件的位置
所以,您知道如何注册事件,但您可能想知道 在哪里 注册它们。别担心,这是一个常见的问题。不幸的是,这是一个很难回答的问题,因为您几乎可以在任何地方注册事件!但是,这里有一些提示。再次强调,就像大多数其他引导代码一样,您可以在 start
文件中注册事件,例如 app/start/global.php
。
如果您的 start
文件变得太拥挤,您可以创建一个单独的 app/events.php
文件,并从 start
文件中包含它。这是一个简单的解决方案,可以将事件注册与其他引导代码清晰地分开。
如果您更喜欢基于类的方法,您可以在 服务提供者 中注册事件。由于这些方法没有一个是“正确的”,请选择您根据应用程序的大小感到舒适的方法。
通配符监听器
注册通配符事件监听器
在注册事件监听器时,您可以使用星号来指定通配符监听器:
Event::listen('foo.*', function($param)
{
// 处理事件...
});
此监听器将处理所有以 foo.
开头的事件。
您可以使用 Event::firing
方法来确定确切触发了哪个事件:
Event::listen('foo.*', function($param)
{
if (Event::firing() == 'foo.bar')
{
//
}
});
使用类作为监听器
在某些情况下,您可能希望使用类来处理事件,而不是使用闭包。类事件监听器将从 Laravel IoC 容器 中解析,提供您在监听器上使用依赖注入的全部功能。
注册类监听器
Event::listen('auth.login', 'LoginHandler');
定义事件监听器类
默认情况下,将调用 LoginHandler
类上的 handle
方法:
class LoginHandler {
public function handle($data)
{
//
}
}
指定要订阅的方法
如果您不想使用默认的 handle
方法,您可以指定应该订阅的方法:
Event::listen('auth.login', 'LoginHandler@onLogin');
队列事件
注册队列事件
使用 queue
和 flush
方法,您可以“排队”一个事件以供触发,但不立即触发:
Event::queue('foo', array($user));
您可以使用 flush
方法运行“冲刷器”并冲刷所有排队的事件:
Event::flush('foo');
事件订阅者
定义事件订阅者
事件订阅者是可以在类内部订阅多个事件的类。订阅者应定义一个 subscribe
方法,该方法将传递一个事件调度实例:
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
类注册它。
$subscriber = new UserEventHandler;
Event::subscribe($subscriber);
您还可以使用 Laravel IoC 容器 来解析您的订阅者。为此,只需将订阅者的名称传递给 subscribe
方法:
Event::subscribe('UserEventHandler');