# 事件
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
目录下创建一个事件订阅类,并在类中添加不同事件的监听方法
例如:
- 通过命令行在demo应用下生成一个事件订阅者
php start make:subscribe demo@User
- 事件订阅类中添加不同事件的监听方法
<?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 | 恢复后 | 当前模型对象实例 |
注
模型事件只在调用模型的方法生效,使用查询构造器操作是无效的