事件

目录

基础介绍

事件为解除程序的耦合性提供了很棒的方法, 在无需修改程序代码的前提下把扩展插入到代码中.

触发事件

要触发事件, 只要告诉Event类你想触发的事件名字就好:

触发一个事件:

$responses = Event::fire('loaded');

请注意, 我们指定fire方法的返回值到一个变量. 此方法将返回一个数组, 包含所有事件的监听的回应.

有时你可能要触发事件, 但只想得到第一个监听的回应:

触发一个事件得到第一个监听的回应:

$response = Event::first('loaded');

提示: first方法仍将触发所有监听到事件的处理程序, 但将只返回第一监听的结果.

Event::until方法会执行事件的处理程序, 直到第一个非空的响应被返回.

触发一个事件直到第一个非空的响应被返回:

$response = Event::until('loaded');

监听事件

那么, 如果没有监听的话事件也就不会称之为事件?注册一个会在事件触发时被执行的事件处理程序:

注册一个事件处理程序:

Event::listen('loaded', function()
{
    // I'm executed on the "loaded" event!
});

我们提供的闭包方法, 会在每次"loaded"事件被触发时执行.

事件队列

有时候, 你会为触发动作"排序(queue)"一个事件, 但又不想立即触发它. 可以用queueflush方法来完成. 首先, 把一个事件抛向队列并赋予一个唯一的标识符:

注册一个事件队列:

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

这个方法接受三个参数. 第一个是队列的名称, 第二个是这个项目在队列上的唯一标识符, 第三个是传递给队列冲刷执行的数据数组.

接下来,为foo队列注册一个冲刷器:

注册一个事件冲刷器:

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

请注意该事件的冲刷器接收两个参数. 第一个是队列事件的唯一标识符(也就是上例中的用户ID). 第二(和任何剩余的)参数将队列事件的其他项目.

最后, 我们可以运行冲刷器了, 用flush方法执行队列事件:

Event::flush('foo');

Laravel事件

有几个事件是由Laravel核心触发的:

bundle开启时事件被触发:

Event::listen('laravel.started: bundle', function() {});

数据库查询时事件被触发:

Event::listen('laravel.query', function($sql, $bindings, $time) {});

response响应发送到浏览器之前事件被触发:

Event::listen('laravel.done', function($response) {});

当通过Log类记录信息时事件被触发:

Event::listen('laravel.log', function($type, $message) {});