(1)定义事件监听的方式

1、全局定义

在app目录下的event.php文件中定义

如下,各参数说明

return [
    'bind'      => [            // 给事件定义类绑定别名
    ],

    'listen'    => [            // 定义监听事件tag和对应的监听类eventClass
        'AppInit'  => [],
        'HttpRun'  => [],
        'HttpEnd'  => [],
        'LogLevel' => [],
        'LogWrite' => [],
    ],

    'subscribe' => [         // 事件订阅类定义
    ],
];

2、使用时定义

Event::listen($tag,$eventClass);

3、触发事件

Event::trigger($tag,$data);

4、事件订阅

可以通过事件订阅机制,在一个监听器中监听多个事件

示例如下:

定义一个订阅类 TestSub.php
然后在event.php文件中的 配置

    'subscribe' => [         // 事件订阅类定义
        'app\subscribe\TestSub'
    ],
<?php
declare (strict_types = 1);

namespace app\subscribe;

class TestSub
{
    public function onTestSub1(){
        echo("testSub1");
    }

    public function onTestSub2(){
        echo("testSub2");
    }
}

然后在控制器调用这两个事件

<?php
namespace app\controller;

use think\facade\Event;
use think\facade\Db;

class Index
{
    public function index()
    {
        event('TestSub1');
        event('TestSub2');
        return 111;
    }
}

此时访问该接口就可以看到这两个事件的结果了

注意:事件可以被主方法捕获异常

例如:事件中处理Db操作,如此事件被包含在事务中,事件的报错 会导致事务回滚,不会提交

文档更新时间: 2021-06-09 20:44   作者:admin