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目录中。

results matching ""

    No results matching ""