# TP5实战技巧--Model事件功能的使用 ## 模型事件 模型事件是指在进行模型的写入操作的时候触发的操作行为,包括模型的save方法和delete方法。 注册的回调方法支持传入一个参数(当前的模型对象实例),并且before_write、before_insert、 before_update 、before_delete事件方法如果返回false,则不会继续执行。 >[danger] 模型事件只可以在调用模型的方法才能生效,使用查询构造器通过Db类操作是无效的 >注意:使用模型中的isUpdate()方法也是无效的 ### 我个人还是推荐 所有的有关于数据库变更的操作 都要使用模型完成. | 钩子 | 对应操作 | 快捷注册方法 | | --- | --- | --- | | before_insert | 新增前 | beforeInsert | | after_insert | 新增后 | afterInsert | | before_update | 更新前 | beforeUpdate | | after_update | 更新后 | afterUpdate | | before_write | 写入前 | beforeWrite | | after_write | 写入后 | afterWrite | | before_delete | 删除前 | beforeDelete | | after_delete | 删除后 | afterDelete | 官方给出了两组 事件方法使用实例 方法一: ~~~ namespace app\index\model; use think\Model; class User extends Model { protected static function init() { User::event('before_insert', function ($user) { if ($user->status != 1) { return false; } }); } } ~~~ 5.04以后的版本 可以使用方法二 ~~~ namespace app\index\model; use think\Model; class User extends Model { protected static function init() { User::beforeInsert(function ($user) { if ($user->status != 1) { return false; } }); } } ~~~ 你可以使用dump功能 查看你操作的对象的详情 也可以使用其他静态方法进行数据操作 ~~~ namespace app\index\model; use think\Model; class User extends Model { protected static function init() { User::afterInsert(function ($user) { //查看详情 dump($user); //查看新增ID dump($user->id); //执行其他静态方法 写入简单的操作记录等等 Dd::("user_log")->insert([$user->id,"注册新用户"]); }); } } ~~~ #### 详细使用实例源码 详见进阶篇 模型事件实战应用---数据库操作日志 https://www.kancloud.cn/mikkle/thinkphp5_study/347954