模型事件

优质
小牛编辑
138浏览
2023-12-01

事件监听分两种,一种是仅限于对象的事件,另一种是静态方法触发的事件

监听方式分两种:1、在类里写监听代码2、定义监听类

批量操作的事件监听,一般建议用监听类方式。对象的事件监听根据习惯选择即可。

事件列表

模型对象事件

事件名常量描述
BeforeInsertModelEvents::BEFORE_INSERT插入前,insert()/save()触发
AfterInsertModelEvents::AFTER_INSERT插入后,insert()/save()触发
BeforeUpdateModelEvents::BEFORE_UPDATE更新前,update()/save()触发
AfterUpdateModelEvents::AFTER_UPDATE更新后,update()/save()触发
BeforeDeleteModelEvents::BEFORE_DELETE删除前,delete()触发
AfterDeleteModelEvents::AFTER_DELETE删除后,delete()触发
BeforeSaveModelEvents::BEFORE_SAVE保存前,先于插入前和更新前触发
AfterSaveModelEvents::AFTER_SAVE保存后,后于插入后和更新后触发
AfterQueryModelEvents::AFTER_QUERY只要最终查询出该模型就会触发

事件传递过来的参数类型为Imi\Model\Event\Param\事件名EventParam

对象事件监听方法1-监听代码

/**
 * Test
 * @Entity
 * @Table(name="tb_test", id={"id", "a"})
 */
class Test extends Model
{
    public function __init($data = [])
    {
        $this->on(ModelEvents::AFTER_INIT, [$this, 'onAfterInit']);
        parent::__init($data);
    }

    public function onAfterInit(\Imi\Model\Event\Param\InitEventParam $data)
    {
        var_dump($data->data);
    }
}

对象事件监听方法2-定义监听类

<?php
namespace XXX\ModelEvent\Logs;

use Imi\Bean\Annotation\ClassEventListener;
use Imi\Model\Event\Param\BeforeInsertEventParam;
use Imi\Model\Event\Listener\IBeforeInsertEventListener;

/**
 * 插入前处理
 * @ClassEventListener(className="\XXX\Model\Test",eventName=\Imi\Model\Event\ModelEvents::BEFORE_INSERT)
 */
class BeforeInsert implements IBeforeInsertEventListener
{
    /**
     * 事件处理方法
     * @param BeforeInsertEventParam $e
     * @return void
     */
    public function handle(BeforeInsertEventParam $e)
    {
        $e->data->data = json_encode($e->data->data);
        $e->data->ip = inet_pton($e->data->ip);
    }
}

模型类静态事件

事件名常量描述
BeforeFindModelEvents::BEFORE_FIND查找前,Model::find()触发
AfterFindModelEvents::AFTER_FIND查找后,Model::find()触发
BeforeSelectModelEvents::BEFORE_SELECT查询前,Model::select()触发
AfterSelectModelEvents::AFTER_SELECT查询后,Model::select()触发
BeforeInitModelEvents::BEFORE_INIT初始化值前,newInstance()触发
AfterInitModelEvents::AFTER_INIT初始化值后,newInstance()触发
BeforeBatchUpdateModelEvents::BEFORE_BATCH_UPDATE批量更新前
AfterBatchUpdateModelEvents::AFTER_BATCH_UPDATE批量更新后
BeforeBatchDeleteModelEvents::BEFORE_BATCH_DELETE批量删除前
AfterBatchDeleteModelEvents::AFTER_BATCH_DELETE批量删除后
BeforeParseDataModelEvents::BEFORE_PARSE_DATA处理 save、insert、update 数据前
AfterParseDataModelEvents::AFTER_PARSE_DATA处理 save、insert、update 数据后

事件传递过来的参数类型为Imi\Model\Event\Param\事件名EventParam

BeforeInitAfterInit是例外,共用Imi\Model\Event\Param\InitEventParam

模型类静态事件监听

事件名称为模型类名:事件名,如:XXX\Model\Test+BeforeBatchUpdate=XXX\Model\Test:BeforeBatchUpdate

<?php
namespace XXX\Listener;

use Imi\Model\Event\Param\BeforeBatchUpdateEventParam;
use Imi\Model\Event\Listener\IBeforeBatchUpdateEventListener;

/**
 * @Listener("XXX\Model\TestBeforeBatchUpdate")
 */
class BeforeBatchUpdate implements IBeforeBatchUpdateEventListener
{
    /**
     * 事件处理方法
     * @param BeforeBatchUpdateEventParam $e
     * @return void
     */
    public function handle(BeforeBatchUpdateEventParam $e)
    {
        // $e->data->name = '123'; // 在更新前可以对数据赋值
    }
}