事件


基本用法

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

订阅事件

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

    $user->save();
});

触发事件

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

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

带有优先级的事件订阅

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

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

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

阻止事件传播

Event::listen('user.login', function($event)
{
    // Handle the event...

    return false;
});

利用通配符匹配多个事件

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

注册多个事件的监听器

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

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

使用类作为监听器

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

注册一个类监事件听器

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

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

定义一个事件监听器类

class LoginHandler {

    public function handle($data)
    {
        //
    }

}

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

指定实现订阅的方法

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

事件队列

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

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

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

注册一个事件清除器

Event::flusher('foo', function($user)
{
    //
});

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

Event::flush('foo');

事件订阅者

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

定义一个事件订阅者

class UserEventHandler {

    /**
     * Handle user login events.
     */
    public function onUserLogin($event)
    {
        //
    }

    /**
     * Handle user logout events.
     */
    public function onUserLogout($event)
    {
        //
    }

    /**
     * Register the listeners for the subscriber.
     *
     * @param  Illuminate\Events\Dispatcher  $events
     * @return array
     */
    public function subscribe($events)
    {
        $events->listen('user.login', 'UserEventHandler@onUserLogin');

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

}

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

注册一个事件订阅者

$subscriber = new UserEventHandler;

Event::subscribe($subscriber);