模型事件

模型事件是指在进行模型的写入操作的时候触发的操作行为 包括模型的save方法和delete方法。

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

模型支持事件

事件描述快捷方法
before_insert新增前beforeInsert
after_insert新增后afterInsert
before_update更新前beforeUpdate
after_update更新后afterUpdate
before_write写入前beforeWrite
after_write写入后afterWrite
before_delete删除前beforeDelete
after_delete删除后afterDelete
before_restore恢复前(V5.1.13+beforeRestore
after_restore恢复后(V5.1.13+afterRestore

使用方法如下:

use thinkModel;
class User extends Model{
public static function init(){
self::event('before_insert', function ($user) {
if (1 != $user->status) {
return false;
            }
        });
    }
}

注册的回调方法支持传入个参数(当前的模型对象实例) 但支持依赖注入的方式增加额外参数。

并且before_writebefore_insertbefore_updatebefore_delete事件方法如果返回false 则不会继续执行。

支持给个位置注册多个回调方法 例如:

        User::event('before_insert', function ($user) {if ($user->status != 1) {return false;
            }
        });// 注册回调到beforeInsert函数User::event('before_insert', 'beforeInsert');

快捷注册

系统提供了内置的事件注册的快捷方法统一在init方法中进行模型事件定义:

use thinkModel;
class User extends Model{
protected static function init(){
self::beforeInsert(function ($user) {
if ($user->status != 1) {
return false;
            }
        });
    }
}

事件观察者

V5.1.13+开始 给模型注册个事件观察者

<?php
namespace app\index\model;

use think\Model;

class User extends Model
{
    protected $observerClass = 'app\index\event\User';
}

或在模型的init方法里面手动注册

<?php
namespace app\index\model;

use think\Model;

class User extends Model
{
    protected static function init()
    {
        self::observe(\app\index\event\User::class);
    }
}

User观察者类定义如下:

<?php
namespace app\index\event;

use app\index\model\Profile;

class User
{
    public function beforeUpdate($user)
    {
        if ('thinkphp' == $user->name) {
            return false;
        }
    }
    
    public function afterDelete($user)
    {
        Profile::destroy($user->id);
    }
}

观察者类的方法就是事件对应的方法名称 方法的第个参数就是模型对象实例 你依然可以通过依赖注入传入其它的对象参数。