# 事件

StartCMS的事件系统在TP的基础上做了进一步的升级,实现了事件全站发布,可自动完成绑定、监听或订阅
通过事件系统可以做到不侵入原有代码完成事件发生后的操作扩展,
用于应用间通信可以更有效降低系统的耦合性

# 事件定义

可以通过助手函数event()或Event类触发

/* 
* 触发UserLogin事件并发送用户对象实例,
* 用于执行用户登录后的一系列操作
*/
// 助手函数触发
event('UserLogin', $user);
// 事件门面触发
Event::trigger('UserLogin', $user);

这里UserLogin表示一个事件标识,如果你定义了单独的事件类,你可以使用事件类名(甚至可以传入一个事件类实例)

// 触发事件类
event('core\event\UserLogin');
// 或
Event::trigger('core\event\UserLogin');

ThinkPHP的事件系统不依赖事件类,如果没有额外的需求,仅通过事件标识也可以使用,省去定义事件类的麻烦
如果实在需要自定义事件类,可以在应用目录/event/下自定义事件类,CMS会自动绑定该事件类
如需进行自定义绑定,则按TP建议直接在应用的event.php事件定义文件中批量绑定

# web/app/appName/event.php
return [
    'bind'    =>    [
        'UserLogin' => 'app\event\UserLogin',
        // 更多事件绑定
    ],
    'listen'  =>    [
        'UserLogin'    =>    ['app\listener\UserLogin'],
        // 更多事件监听
    ],
    'subscribe'    =>    [
       'app\subscribe\User',
        // 更多事件订阅
    ],
];

注意

如果应用目录下定义了event.php则需要手动绑定事件监听和事件订阅,系统不再自动加载

# 事件监听

StartCMS事件监听只需在app/应用目录/listener目录下创建一个事件监听类,并在类中定义一个handle方法(支持依赖注入)
在handle方法中如果返回了false,则表示监听中止,将不再执行该事件后面的监听

  • 一般事件监听类名即为事件名
<?php
namespace app\demo\listener;

// demo应用监听用户登录事件
class UserLogin
{
    public function handle($user)
    {
        // 事件监听处理
    }   
}

# 事件订阅

事件订阅与事件监听的区别:
一个事件可以有多个监听器,但是每个监听器只能监听一个事件。如果想在一个类中监听多个事件,就需要使用事件订阅者。
StartCMS事件订阅只需在app/应用目录/subscribe目录下创建一个事件订阅类,并在类中添加不同事件的监听方法 例如:

  1. 通过命令行在demo应用下生成一个事件订阅者
php start make:subscribe demo@User
  1. 事件订阅类中添加不同事件的监听方法
<?php
namespace app\demo\subscribe;

class User
{
    public function onUserLogin($user)
    {
        // UserLogin事件响应处理
    }

    public function onUserLogout($user)
    {
        // UserLogout事件响应处理
    }

注意

监听事件的方法命名规范是on+事件标识(驼峰命名)

# 内置事件

# 系统事件

事件 描述 参数
AppInit 系初始化标签位
HttpRun 请求开始标签位
HttpEnd 请求结束标签位 当前响应对象实例
LogWrite 日志write方法标签位 当前写入的日志信息
RouteLoaded 路由加载完成
LogRecord 日志记录

# 用户事件

事件 描述 参数
UserRegister 用户注册 当前用户对象实例
UserLogin 用户登录 当前用户对象实例
UserLogout 用户登出 当前用户对象实例

# 应用事件

事件 描述 参数
AppInstall 应用安装后事件 app.json
AppUninstall 应用卸载后事件 app.json
AppBeforeInstall 应用安装前事件 app.json
AppBeforeUninstall 应用卸载前事件 app.json

# 模型事件

模型事件是指在进行模型的查询和写入操作的时候触发的操作行为。

事件 描述 参数
onAfterRead 查询后 当前模型对象实例
onBeforeInsert 新增前 当前模型对象实例
onAfterInsert 新增后 当前模型对象实例
onBeforeUpdate 更新前 当前模型对象实例
onAfterUpdate 更新后 当前模型对象实例
onBeforeWrite 写入前 当前模型对象实例
onAfterWrite 写入后 当前模型对象实例
onBeforeDelete 删除前 当前模型对象实例
onAfterDelete 删除后 当前模型对象实例
onBeforeRestore 恢复前 当前模型对象实例
onAfterRestore 恢复后 当前模型对象实例

模型事件只在调用模型的方法生效,使用查询构造器操作是无效的

上次更新: 10/30/2022, 5:32:07 PM