内置应用事件

AppInit

应用初始化标签位

HttpRun

应用开始标签位

HttpEnd

应用结束标签位

当前响应对象实例

LogWrite

日志write方法标签位

当前写入的日志信息

RouteLoaded

路由加载完成

LogRecord

日志记录​​V6.0.8+​

内置模型事件

after_read

查询后

before_insert

新增前

after_insert

新增后

before_update

更新前

after_update

更新后

before_write

写入前

after_write

写入后

before_delete

删除前

after_delete

删除后


事件创建

使用命令行

php think make:event MyEvent

会自动创建一个事件文件:/app/event/MyEvent.php

<?php
declare (strict_types = 1); //开启类型严格检查

namespace app\event;

class MyEvent{
//手动加上一个 handler 方法,事件调用时,用来处理事件逻辑
public function handle($user){

}
}

事件注册(绑定)

在 /app/event.php 中注册我们编写的事件,加入我们的事件:

return [
'bind' => [
//...
'MyEvent' => 'app\event\MyEvent'
],
];

也可以使用动态注册

Event::bind(['MyEvent' => 'app\event\MyEvent']);

事件调用

两种方式:门面、函数助手

Event::trigger('UserLogin');
event('UserLogin');

事件监听

使用命令行创建监听器:

php think make:listener MyListener

会自动生成一个监听器文件:

<?php
declare (strict_types = 1);
namespace app\listener;

class MyListener{
/**
* 事件监听处理,不同于事件,该方法命令行已经为我们准备好了,我们需要实现里面的逻辑。
*
* @return mixed
*/
public function handle($event){
//监听的事件发生时,执行一些操作...
}
}

指定事件监听后的处理:

//使用监听器处理
Event::listen('MyEvent', 'app\listener\MyListener');

//如果逻辑简单,可以直接使用闭包处理,如果返回 false,则不再向后面的监听器传递
Event::listen('MyEvent', function($user) {
//do something
});

//使用通配符监听多个事件
Event::listen('model.*', 'app\listener\ModelListen');

事件订阅

除了监听器,也可以用订阅器来处理事件,它可以轻松的处理多个事件

创建订阅者

php think make:subscribe MySubscribe

自动生成一个简单的订阅者文件,需要我们手动实现 subscribe 方法处理事件订阅

<?php
declare (strict_types = 1);

namespace app\subscribe;

class MySubscribe{
public function handleEvent1(){}
public function handleEvent2(){}

public function subscribe(Event $event){
$event->listen('Event1', [$this,'handleEvent1']);
$event->listen('Event2', [$this,'handleEvent2']);
}
}

注册订阅者:

在 /app/event.php 文件的 subscribe 属性数组中,加入我们的订阅者

'subscribe'    =>    [
//...
'app\subscribe\MySubscribe',
],

或者用动态注册

Event::subscribe('app\subscribe\User');