事件


基本用法

Laravel中的Event类实现了简单的观察者模式,允许你在应用程序中订阅和监听事件。

订阅事件

  1. Event::listen('user.login', function($user)
  2. {
  3. $user->last_login = new DateTime;
  4. $user->save();
  5. });

触发事件

  1. $event = Event::fire('user.login', array($user));

你也可以在订阅事件时指定优先级。优先级高的监听器将会被优先执行,相同优先级的将被按照订阅顺序执行。

带有优先级的事件订阅

  1. Event::listen('user.login', 'LoginHandler', 10);
  2. Event::listen('user.login', 'OtherHandler', 5);

如果希望阻止事件传播到其他监听器,只需让监听器返回false即可实现:

阻止事件传播

  1. Event::listen('user.login', function($event)
  2. {
  3. // Handle the event...
  4. return false;
  5. });

利用通配符匹配多个事件

注册事件监听器时,可以使用星号匹配多个事件进行监听:

注册多个事件的监听器

  1. Event::listen('foo.*', function($param, $event)
  2. {
  3. // Handle the event...
  4. });

该监听器将会处理所有以foo.开始的事件。注意:完整的事件名将以事件处理器的最后一个参数传入。

使用类作为监听器

在某些情况下,你可能希望使用类来代替闭包处理事件。类事件监听器(Class event listener)通过 Laravel IoC 容器实现,为监听器提供了强大的依赖注入的能力。

注册一个类监事件听器

  1. Event::listen('user.login', 'LoginHandler');

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

定义一个事件监听器类

  1. class LoginHandler {
  2. public function handle($data)
  3. {
  4. //
  5. }
  6. }

如果你不想使用默认的handle方法,你可以在订阅时指定方法:

指定实现订阅的方法

  1. Event::listen('user.login', 'LoginHandler@onLogin');

事件队列

使用queueflush方法,可以将事件放入"队列"中,而不是立刻执行:

向事件队列中添加一个事件

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

注册一个事件清除器

  1. Event::flusher('foo', function($user)
  2. {
  3. //
  4. });

最后,你可以使用flush方法清除掉队列中的所有事件:

  1. Event::flush('foo');

事件订阅者

事件订阅者类可以在其自身内部订阅多个事件。并且事件订阅者应该定义subscribe方法,并接收一个事件调度器实例作为参数:

定义一个事件订阅者

  1. class UserEventHandler {
  2. /**
  3. * Handle user login events.
  4. */
  5. public function onUserLogin($event)
  6. {
  7. //
  8. }
  9. /**
  10. * Handle user logout events.
  11. */
  12. public function onUserLogout($event)
  13. {
  14. //
  15. }
  16. /**
  17. * Register the listeners for the subscriber.
  18. *
  19. * @param Illuminate\Events\Dispatcher $events
  20. * @return array
  21. */
  22. public function subscribe($events)
  23. {
  24. $events->listen('user.login', 'UserEventHandler@onUserLogin');
  25. $events->listen('user.logout', 'UserEventHandler@onUserLogout');
  26. }
  27. }

一旦定义了事件订阅者,就可以使用Event类进行注册。

注册一个事件订阅者

  1. $subscriber = new UserEventHandler;
  2. Event::subscribe($subscriber);