# 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