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

一、总结

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

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

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

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

实例:图片上传

模型:

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

控制器:

<?php
namespace app\admin\controller;
use think\Controller; use app\admin\model\Article as ModelArticle;
use app\admin\model\Cate as ModelCate;
use app\admin\controller\Base; 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 app\index\model;

use think\Model;

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 app\index\model;

use think\Model;

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 删除后

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

  1. CI(CodeIgniter)框架中的增删改查操作

    我们创建一个模型( 项目目录/models/),请注意:模型名与文件名相同且必须继承数据核心类CI_Model,同时重载父类中的构造方法 CodeIgniter的数据函数类在 \models\User ...

  2. mybatis中的增删改查操作

    在这一个部分,主要进行增删改查的示例书写. 增删改查可以基于xml的,也可以基于注解的方式. 一:对单条数据的查询 1.目录结构 这个使得目录更加清晰 2.User.java 这个使用以前的user表 ...

  3. 48.Python中ORM模型实现mysql数据库基本的增删改查操作

    首先需要配置settings.py文件中的DATABASES与数据库的连接信息, DATABASES = { 'default': { 'ENGINE': 'django.db.backends.my ...

  4. 后盾网lavarel视频项目---lavarel使用模型进行增删改查操作

    后盾网lavarel视频项目---lavarel使用模型进行增删改查操作 一.总结 一句话总结: 使用模型操作常用方法 查一条:$model=Tag::find($id); 删一条:Tag::dest ...

  5. python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查

    Django中的ORM简介 ORM概念:对象关系映射(Object Relational Mapping,简称ORM): 用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够 ...

  6. Django——6 模型基础ORM 数据库连接配置 模型的创建与映射 数据的增删改查

    Django Django的ORM简介 数据库连接配置 模型的创建与映射 数据库的增删改查 增数据 查数据及补充 改数据 删数据   Django的ORM系统分析 ORM概念:对象关系映射(Objec ...

  7. ant-design-vue中tree增删改

    ant-design-vue中tree增删改 1. 使用背景 新项目中使用了ant-design-vue组件库.该组件库完全根基数据双向绑定的模式实现.只有表单组件提供少量的方法.所以,在使用ant- ...

  8. PHP程序中使用PDO对象实现对数据库的增删改查操作的示例代码

    PHP程序中使用PDO对象实现对数据库的增删改查操作(PHP+smarty) dbconn.php <?php //------------------------使用PDO方式连接数据库文件- ...

  9. jQuery在HTML文档加载完毕后自动执行某个事件;

    原来onchange=“fucntionname(parms)”: <select name="country" id="selCountries_{$sn}&qu ...

随机推荐

  1. 14.字符串hash寻找第一个只出现一次的字符

    //char 0-255一共256个 char getonebyhash(char *str) { if (str == NULL) { return '\0'; } char ch = '\0'; ...

  2. Whitening

    The goal of whitening is to make the input less redundant; more formally, our desiderata are that ou ...

  3. CMDB学习之二数据采集

    首先也要调用插件的方式,来写采集数据插件,在src目录下创建一个插件 plugins ,然后在plugins下创建disk.py ,memory.py, network.py等等 src plugin ...

  4. Python笔记---错误笔记

    Python---错误笔记 1. Python编码问题: 我们在编写 Python 脚本时,往往会写上中文凝视. 可是有时候,当我们执行程序时.却发现例如以下错误:SyntaxError: Non-A ...

  5. win7-时间更新

    今天发现电脑的时间不对,后来就自己摸索了时间的自动更新方法.自己记录下来,以方便以后忘了查询 点击电脑右下角的时间->选择更改日期和时间设置->选择internet->更改设置-&g ...

  6. excel表如何实现多if选择结构多分支判断

    excel表如何实现多if选择结构多分支判断 一.总结 一句话总结:把多if分支转换成单if分支相加. 也可以if分支,也可以lookup函数. 1.CHOICE: +2 if band A; +1 ...

  7. php课程 12-38 php的类的构造方法和析构方法怎么写

    php课程 12-38 php的类的构造方法和析构方法怎么写 一.总结 一句话总结:a.__construct(参数){},__destruct(){},b.如果类中的一个方法和类名相同,则该方法为构 ...

  8. Python: scikit-image gamma and log 对比度调整

    这个函数,主要用来做对比度调整,利用 gamma 曲线 或者 log 函数曲线, gamma 函数的表达式: y=xγ, 其中, x 是输入的像素值,取值范围为 [0−1], y 是输出的像素值,通过 ...

  9. Flume的可靠性

    Flume的可靠性 当节点出现故障时,日志能够被传送到其他节点上而不会丢失. Flume提供了三种级别的可靠性保障,从强到弱依次分别为:end-to- end(收到数据agent首先将event写到磁 ...

  10. item-设置可见性

    如果我们想要设置menu中item的可见行,有两种方式: 1.直接在menu的xml代码中设置 <menu> <item android:id="@+id/action_h ...