1. 事件
1.1. 简介
在完成某个事件的时候,对事件监听的任务进行触发。 事件监听提供两个方式,动态监听和配置默认的事件监听。 并且对配置的事件监听任务提供同步和异步的快速转换,对于异步任务提供指定执行队列的配置。
1.2. 基本用法
B2B2C 的event
类提供一个简单的观察者实现,允许您在应用程序里订阅与监听事件。
1.2.1. 订阅事件
应用程序中订阅事件,其中闭包的方式只支持同步模式。
event::listen('user.login', function ($user) { $user->loginTime = time(); $user->loginLog(); }); event::listen('user.login', 'pam_events_listeners_loginLog', 'sync', 5);
配置文件中订阅事件
config/events.php
,支持同步和异步两种模式。<?php /** * 返回注册的事件 */ return [ /* |-------------------------------------------------------------------------- | 定义事件触发后需要执行的任务 |-------------------------------------------------------------------------- | */ 'listen' => [ //触发事件后执行被监听的任务 //第一个参数为执行任务的执行类和方法 执行方法未指定则默认为handle //第二个参数设置该任务为同步执行还是异步执行 //第三个参数为执行任务的优先级,数值越大则越先执行,相同等级则按照顺序执行 默认为0 //指定参数 queue 对应为该任务异步执行的队列 默认为system_tasks_events 'user.login' => [ ['system_events_listeners_testSync', 'sync'], ['system_events_listeners_testAsync@test', 'async'], ], ], ];
1.2.2. 触发事件
$response = event::fire('user.login', array(['key1'=>'value1','key2'=>'value2']) );
程序中可根据触发事件执行后返回的响应数组($respons)做后续操作。
1.2.3. 订阅可同步异步相互转化的事件
您可以在订阅事件的时候指定监听任务的同步模式和异步模式,只有具体执行事件任务类implements
base_events_interface_queue
接口类才可以对该监听任务由同步模式转为异步模式,
否则执行的还是同步模式。
//订单支付完成触发的事件任务
'trade.pay' => [
//订单付款成功记录日志
['systrade_events_listeners_payTradeLog', 'async'],
],
其中付款完成记录日志的监听任务
class systrade_events_listeners_payTradeLog implements base_events_interface_queue {
}
1.2.4. 订阅有优先顺序的事件
您也可以在订阅事件的时候指定一个优先顺序。 有较高优先权的监听者会先被执行,当监听者有一样的优先权时将会依照订阅的顺序执行. 如果在订阅的时候没有指定优先级那么默认为0。
应用程序中订阅
event::listen('user.login', 'pam_events_listeners_cookieWithCartNumber@login', 'sync', 10); event::listen('user.login', 'pam_events_listeners_loginLog', 'sync', 5);
config/events.php
中配置注册订阅'listen' => [ 'user.login' => [ ['system_events_listeners_testSync', 'sync', 2 ], ['system_events_listeners_testAsync@test', 'async', 4 ], ], ],
1.2.5. 订阅指定异步监听任务队列的事件
您可以在订阅事件的时候指定执行异步监听任务的队列。新增一个queue
的参数。
默认使用system_tasks_events
对应执行异步监听任务。
应用程序中订阅
event::listen('user.login', 'system_events_listeners_testaSync', 'async', 10, 'system_tasks_notifyPrism');
config/events.php
中配置注册订阅'listen' => [ 'user.login' => [ ['system_events_listeners_testSync', 'async', 2, 'queue'=>'system_tasks_notifyPrism'], ], ],
1.2.6. 停止继续传递事件
您有时候会希望停止继续传递事件到其他监听者。 您可以通过从监听者回传 false 来做到这件事:
event::listen('user.login', function($user)
{
// Handle the event...
return false;
});
1.3. 测试用例
在框架中本身提供了触发事件的测试用例
执行测试用例命令,执行测试用例文件
app/base/testcase/testEvent.php
./cmd dev:test do base testEvent.php
触发订阅的事件,测试用例文件中的订阅和配置注册的订阅
#config/events.php 'listen' => [ 'test' => [ ['system_events_listeners_testSync', 'sync'], ['system_events_listeners_testAsync@test', 'async'], ], ],
配置方式注册的订阅执行类在
app/system/lib/events/listeners
目录中。