• thinkphp模型事件(钩子函数:模型中在增删改等操作前后自动执行的事件)


    thinkphp模型事件(钩子函数:模型中在增删改等操作前后自动执行的事件)

    一、总结

    1、通过模型事件(钩子函数),可以在插入更新删除等前后执行一些特定的功能

    2、模型事件是写在模型里面的,控制器中也必须用了模型操作数据库才能触发模型事件

    3、模型事件是需要注册的,注册了才能使用,可用init统一注册

    4、支持传入一个参数(当前的模型对象实例),也就是你传到模型中的数据,也就是你传到数据库中的数据

    实例:图片上传

    模型:

     1 <?php
     2 namespace appadminmodel;
     3 use thinkModel;
     4 
     5 class Article extends Model
     6 {
     7     protected static function init() //用来统一注册,里面的事件注册了才能用
     8     {
     9         Article::event('before_insert', function ($datain) { //支持传入一个参数,(当前的模型对象实例),也就是你传到模型中的数据
    10             if($_FILES['athumb']['tmp_name']){
    11                 // 获取表单上传文件 例如上传了001.jpg
    12                 $file = request()->file('athumb');
    13                 // 移动到框架应用根目录/public/uploads/ 目录下
    14                 $info = $file->move(ROOT_PATH . 'public' . DS . 'static/uploads/admin');
    15                 // 已经上传成功,我们要把文件的路径写进数据库
    16                 $datain['athumb']='/static/uploads/admin/'.$info->getSaveName();
    17             }
    18         });
    19     }
    20 }    

    控制器:

    <?php
    namespace appadmincontroller;
    use thinkController;
    
    use appadminmodelArticle as ModelArticle;
    use appadminmodelCate as ModelCate;
    use appadmincontrollerBase;
    
    class Article extends Base
    {
        public function add(){
            if(request()->isPost()){
                $datain=input('post.');
                $datain['time']=time();
                $modelArticle=new ModelArticle();
                //2、获取传入的文件数据
                /*在模型的事件中处理了*/
                if($modelArticle->save($datain)){ //用了模型,传入的参数就是$datain
                    $this->success('添加文章成功!!','article/lst');
                }else{
                    $this->error('添加文章失败!!');
                }
                // dump($datain);die;
                return;
            }
            //将栏目信息显示回增加界面
            //catetree方法新增了栏目的level字段
            $modelCate=new ModelCate();
            $data=$modelCate->catetree();
            $this->assign('data',$data);
    
            return view();
        }
    }

    二、thinkphp模型事件(钩子函数)

    模型事件

    版本新增功能
    5.0.4 增加模型事件注册快捷方法

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

    模型事件只可以在调用模型的方法才能生效,使用查询构造器通过Db类操作是无效的

    模型类支持before_deleteafter_deletebefore_writeafter_writebefore_updateafter_updatebefore_insertafter_insert事件行为

    标签位描述
    before_insert 新增前
    after_insert 新增后
    before_update 更新前
    after_update 更新后
    before_write 写入前
    after_write 写入后
    before_delete 删除前
    after_delete 删除后

    使用方法如下:

    User::event('before_insert', function ($user) {
                if ($user->status != 1) {
                    return false;
                }
            });
    

    注册的回调方法支持传入一个参数(当前的模型对象实例),并且before_writebefore_insert、 before_updatebefore_delete事件方法如果返回false,则不会继续执行。

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

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

    可以在模型类的init方法里面统一注册模型事件,例如:

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

    调用当前模型也可以写入 self::event('before_insert', ...)

    快捷注册(V5.0.4+

    V5.0.4+版本开始,系统提供了内置的事件注册的快捷方法,你可以用下面的方式替代

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

    这些模型类的快捷方法如下:

    标签位描述
    beforeInsert 新增前
    afterInsert 新增后
    beforeUpdate 更新前
    afterUpdate 更新后
    beforeWrite 写入前
    afterWrite 写入后
    beforeDelete 删除前
    afterDelete 删除后
  • 相关阅读:
    Angular $http解析通过接口获得的json数据
    Python基础(十四)—装饰器 wrapper
    Python基础(十二)—面向对象拾遗(__slots__、@property、枚举类、元类)
    Python基础(十三)—切片、yield、生成器、序列化JSON
    Python基础(十一)—魔法方法(构造析构、属性魔法、算数魔法、类型魔法等)
    Python基础(十)—面向对象的深入讲解(继承、Mixin编程机制等)
    Python基础(九)—异常except、else&with、异常的名称层次
    Python基础(八)—编码详解(ASCII、GBK、Unicode、UTF-8等)、decode&encode
    Python基础(七)—输入输出(open、os、pickle)
    Python基础(六)—函数式编程(内部函数、闭包、lambda、filter/map/reduce/sorce、偏函数)
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/9030567.html
Copyright © 2020-2023  润新知