网站

thinkphp5 模型事件处理事务 比如添加内容前必须先做某些事

分类 :thinkphp5     2020-06-01 人气:0 0条评论

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

一共包含这几项功能。

注意

这些是模型功能,所以必须在模型中型使用。
控制器中使用时必须采用模型处理,否则该功能不起作用。

现在有一个图片上传功能,是在新增内容前就上传,就可以将上传功能放在before_insert里面。

新建方法

在当前表的模型中新建方法,可以看出这是一个受保护静态的方法
protected static function init

放入before_insert方法

也就是将下面的代码放入刚才定义的init方法中。
其它的几种功能,也同样这样定义即可。
这时候将代码放进里面去就可以了,下方几个参数解答
Article这是当前的表名
$data这个可随便定义名称,为了清晰,可以直接用控制器中要存储的变量。

Article::event('before_insert',function($data){
...这儿放自己的代码
}

下面看一下完整的代码

protected static function init()
   {
       Article::event('before_insert',function($data){


            $file = request()->file('thumb');
            if($file){
                $info = $file->move(ROOT_PATH . '../' . DS . 'uploads/' . date('Y'));
                $data['thumb'] = date('Y')."".$info->getSaveName();
                if(!$info){
                    $file->getError('上传失败');
                }
            }


       });
   }

只要这样设置完,在新添加内容前,一定会先执行里面的代码,非常不错。

我控制器中的代码

if(Request()->isPost()){
            $article = new ArticleModel();
            $data = input('post.');
            $res = $article->save($data);
}

可以看出控制器中没有一丝事件模型的影子,它会自动执行。
这也同时要注意,要在控制器中标注一下,方便后期查找修改。

多个方法

如果有多个方法,如添加前,修改前…等等都要使用,这时候直接将所有的都放在init里面就可以了。

评论

大侠名号:   验证暗号: 点击我更换图片

继续阅读