模型事件

    目录

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

    监听方式分两种: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(array $data = [], bool $queryRelation = true): void
        {
            $this->on(ModelEvents::AFTER_INIT, [$this, 'onAfterInit']);
            parent::__init($data, $queryRelation);
        }
    
        public function onAfterInit(\Imi\Model\Event\Param\InitEventParam $data): void
        {
            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): void
        {
            $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\Test:BeforeBatchUpdate")
     */
    class BeforeBatchUpdate implements IBeforeBatchUpdateEventListener
    {
        /**
         * 事件处理方法
         * @param BeforeBatchUpdateEventParam $e
         * @return void
         */
        public function handle(BeforeBatchUpdateEventParam $e): void
        {
            // $e->data->name = '123'; // 在更新前可以对数据赋值
        }
    }