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. springboot扫描通用的依赖模块

    将实际使用类的启动类改为如下形式启动: public class OrderApplication { public static void main(String[] args) { Object[ ...

  2. 洛谷——P1498 南蛮图腾

    https://www.luogu.org/problem/show?pid=1498 题目描述 自从到了南蛮之地,孔明不仅把孟获收拾的服服帖帖,而且还发现了不少少数民族的智慧,他发现少数民族的图腾往 ...

  3. IOS经常使用的性能优化策略

    1.用ARC管理内存 2.对于UITableView使用重用机制 3.UIView及其子类设置opaque=true 4.主进程是用来绘制UI的,所以不要堵塞 5.慎用XIB,由于XIB创建UIVie ...

  4. 基本3D变换之World Transform, View Transform and Projection Transform

    作者:i_dovelemon 来源:CSDN 日期:2014 / 9 / 28 主题:World Transform, View Transform , Projection Transform 引言 ...

  5. PHP 版本简单记录

    PHP 版本简单记录 PHP 博物馆         http://museum.php.net/php5/ PHP 版本发布       https://secure.php.net/release ...

  6. 11.Bean2Document-BEAN转document

    1. package com.glodon.gspm.adapter.plugin.common; import com.glodon.cloudt.tenancy.context.TenantCon ...

  7. 1.3 Quick Start中 Step 4: Send some messages官网剖析(博主推荐)

    不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Step 4: Send some messages Step : 发送消息 Kaf ...

  8. 对ng-repeat的表格内容添加不同样式:ng-style

    对ng-repeat的表格内容添加不同样式,html代码: <tr ng-repeat="x in tableData"> <td>{{x.networkN ...

  9. 如何优雅的写UI——(1)MFC六大核心机制-程序初始化

    很多做软件开发的人都有一种对事情刨根问底的精神,例如我们一直在用的MFC,很方便,不用学太多原理性的知识就可以做出各种窗口程序,但喜欢钻研的朋友肯定想知道,到底微软帮我们做了些什么,让我们在它的框架下 ...

  10. Servlet 规范笔记—servlet概念及结构

     Servlet, 这个词对java程序员并不陌生,我想几乎每个java程序员在学习J2EE知识时,首先学习的就是servlet,这是一种正确的学习方式,在我看来Servlet是J2EE的基础,要熟练 ...