thinkphp模型事件(钩子函数:模型中在增删改等操作前后自动执行的事件)
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_delete
、after_delete
、before_write
、after_write
、before_update
、after_update
、before_insert
、after_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_write
、before_insert
、 before_update
、before_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模型事件(钩子函数:模型中在增删改等操作前后自动执行的事件)的更多相关文章
- CI(CodeIgniter)框架中的增删改查操作
我们创建一个模型( 项目目录/models/),请注意:模型名与文件名相同且必须继承数据核心类CI_Model,同时重载父类中的构造方法 CodeIgniter的数据函数类在 \models\User ...
- mybatis中的增删改查操作
在这一个部分,主要进行增删改查的示例书写. 增删改查可以基于xml的,也可以基于注解的方式. 一:对单条数据的查询 1.目录结构 这个使得目录更加清晰 2.User.java 这个使用以前的user表 ...
- 48.Python中ORM模型实现mysql数据库基本的增删改查操作
首先需要配置settings.py文件中的DATABASES与数据库的连接信息, DATABASES = { 'default': { 'ENGINE': 'django.db.backends.my ...
- 后盾网lavarel视频项目---lavarel使用模型进行增删改查操作
后盾网lavarel视频项目---lavarel使用模型进行增删改查操作 一.总结 一句话总结: 使用模型操作常用方法 查一条:$model=Tag::find($id); 删一条:Tag::dest ...
- python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查
Django中的ORM简介 ORM概念:对象关系映射(Object Relational Mapping,简称ORM): 用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够 ...
- Django——6 模型基础ORM 数据库连接配置 模型的创建与映射 数据的增删改查
Django Django的ORM简介 数据库连接配置 模型的创建与映射 数据库的增删改查 增数据 查数据及补充 改数据 删数据 Django的ORM系统分析 ORM概念:对象关系映射(Objec ...
- ant-design-vue中tree增删改
ant-design-vue中tree增删改 1. 使用背景 新项目中使用了ant-design-vue组件库.该组件库完全根基数据双向绑定的模式实现.只有表单组件提供少量的方法.所以,在使用ant- ...
- PHP程序中使用PDO对象实现对数据库的增删改查操作的示例代码
PHP程序中使用PDO对象实现对数据库的增删改查操作(PHP+smarty) dbconn.php <?php //------------------------使用PDO方式连接数据库文件- ...
- jQuery在HTML文档加载完毕后自动执行某个事件;
原来onchange=“fucntionname(parms)”: <select name="country" id="selCountries_{$sn}&qu ...
随机推荐
- 二分图简单概念&&HDU 2063
二分图: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同 ...
- less---查看文件
- Lusac定理
转载大佬的模版:http://www.cnblogs.com/vongang/archive/2012/12/02/2798138.html
- C# WinForm设置透明
1:通过设置窗体的 TransparencyKey实现 例:窗体中的白色会变成透明 this.BackColor =Color.White; this.TransparencyKey = ...
- Objective-C ,ios,iphone开发基础:UIAlertView使用详解
UIAlertView使用详解 Ios中为我们提供了一个用来弹出提示框的类 UIAlertView,他类似于javascript中的alert 和c#中的MessageBox(); UIAlertVi ...
- Linux 获取上个月的第一秒和上个月的最后一秒
因为写脚本需求须要获得上个月的第一秒和上个月的最后一秒,查阅了相关资料,并通过自己实践.找到了以下这样的方法能满足要求.在此备注,若有其它好的方法.请留言.本人将不胜感激. 获取上个月的第一秒: da ...
- 结构体类型重声明导致的bug一个
bug前提条件 当模块比較多.头文件较多,某个结构体类型会在当前模块中又一次声明进而引用其成员,而不直接包括其它模块的头文件. 这种优点是不引入不须要的类型声明到此模块.头文件包括的交叉:坏处是,添加 ...
- NOPI 锁定Excel单元格不让编辑的方法
简介:原生态纯JavaScript 100大技巧大收集---你值得拥有 http://www.cnblogs.com/xl900912/p/4223629.html 从博客园上看都的关于JS的一些常见 ...
- Flask设置配置文件
Flask修改配置: from flask import Flask app = Flask(__name__) app.config['DEBUG'] = True @app.route('/') ...
- 手动挂接NFS
环境: 单板:s3c2440 内核:Linux-2.6.22.6 U-boot1.16 初始根文件系统Yaffs2 前提条件 1. 开发板上要烧写好文件系统 2. 能正常开机进入Linux系统 3. ...