thinkph6模型事件

本文详细解析了ThinkPHP框架中模型的各种事件,包括查询、新增、更新、删除、恢复等操作触发的事件及其对应的事件方法名。通过实例演示了如何在不同场景下触发这些事件,为开发者提供了一个深入理解模型事件机制的指南。

模型事件
首先,从手册上,我们可以知道模型支持以下事件:

事件	             描述	事件方法名

after_read	    查询后	onAfterRead
before_insert	新增前	onBeforeInsert
after_insert	新增后	onAfterInsert
before_update	更新前	onBeforeUpdate
after_update	更新后	onAfterUpdate
before_write	写入前	onBeforeWrite
after_write	    写入后	onAfterWrite
before_delete	删除前	onBeforeDelete
after_delete	删除后	onAfterDelete
before_restore	恢复前	onBeforeRestore
after_restore	恢复后	onAfterRestore
<?php
namespace app\model;

use think\Model;
use think\model\concern\SoftDelete;

class Users extends Model
{
    // 软删除
    use SoftDelete;

    public static function onAfterRead($user) {
        dump('查询后');
    }

    public static function onBeforeInsert($user) {
        dump('新增前');
    }

    public static function onAfterInsert($user) {
        dump('新增后');
    }

    public static function onBeforeUpdate($user) {
        dump('更新前');
    }

    public static function onAfterUpdate($user) {
        dump('更新后');
    }

    public static function onBeforeWrite($user) {
        dump('写入前');
    }

    public static function onAfterWrite($user) {
        dump('写入后');
    }

    public static function onBeforeDelete($user) {
        dump('删除前');
    }

    public static function onAfterDelete($user) {
        dump('删除后');
    }

    public static function onBeforeRestore($user) {
        dump('恢复前');
    }

    public static function onAfterRestore($user) {
        dump('恢复后');
    }
}

方法

$data = [
    'name' => 'test',
    'phone' => '13888888888',
    'area' => '0',
    'address' => '广东省韶关市',
    'balance' => '0',
    'password' => '0',
    'status' => '0',
    'last' => '2019-01-01 00:00:00',
];

dump('Users::create($data)');
$users = Users::create($data);

dump('Users::insert($data)');
Users::insert($data);

dump('Users::where(\'id\', $users)->update([\'area\' => 1])');
Users::where('id', $users['id'])->update(['area' => 1]);

dump('$users->save([\'area\' => 2])');
$users->save(['area' => 2]);

dump('Users::where(\'id\', $users[\'id\'])->delete()');
Users::where('id', $users['id'])->delete();

dump('Users::where(\'1=1\')->find()');
$users = Users::where('id', '>', 0)->find();

dump('Users::destroy($users[\'id\'])');
Users::destroy($users['id']);

dump('$users->restore()');
$users->restore();

dump('$users->delete()');
$users->delete();

测试

^ "Users::create($data)"
^ "写入前"
^ "新增前"
^ "新增后"
^ "写入后"
^ "Users::insert($data)"
^ "Users::where('id', $users)->update(['area' => 1])"
^ "$users->save(['area' => 2])"
^ "写入前"
^ "更新前"
^ "更新后"
^ "写入后"
^ "Users::where('id', $users['id'])->delete()"
^ "Users::where('1=1')->find()"
^ "查询后"
^ "Users::destroy($users['id'])"
^ "查询后"
^ "删除前"
^ "删除后"
^ "$users->restore()"
^ "恢复前"
^ "恢复后"
^ "$users->delete()"
^ "删除前"
^ "删除后"

总结

create()
模型创建数据方法,会触发写入前、新增前、新增后、写入后。使用模型的save()saveAll()来新增方法也会触发这几个事件。

insert()
insert()是Db类的方法,不是模型方法,不会触发模型事件。

update()
update()是Db类的方法,不是模型方法,不会触发模型事件。

save()
使用模型的save()方法来更新数据,会触发写入前、更新前、更新后、写入后事件。

delete()
如果是使用模型方法查询出来数据,然后再删除数据,则会触发删除前、删除后事件。
如果是直接使用条件删除,则不会触发模型事件。因为直接使用条件删除,这时候的delete()方法不是模型方法。

find()
该查询方法会触发查询后事件

destroy()
该删除数据方法会触发查询后、删除前、删除后。所以,该方法是先查询出数据,然后再删除该数据。

restore()
该软删除恢复方法会触发恢复前、恢复后方法
### 配置宝塔面板中的ThinkPHP6 #### 安装Redis扩展 为了使ThinkPHP6能够高效运作并充分利用缓存机制,在宝塔面板中需先安装Redis扩展。通过进入宝塔面板的软件商店,定位到所使用的PHP版本下的设置选项卡,随后选择“安装扩展”,从中挑选并安装Redis扩展[^1]。 #### 设置伪静态规则 为了让URL更加简洁友好,在宝塔面板内针对部署有ThinkPHP6应用的站点执行伪静态设定是非常必要的操作之一。具体做法是在网站设置里选取相应的伪静态模板——这里应选用`thinkphp`作为预设模式,从而实现自动去除URL中的`index.php`部分[^2]。 #### 数据库管理与连接配置 当涉及到数据存储时,通常会借助MySQL或其他关系型数据库来配合ThinkPHP框架工作。对于Windows环境下基于宝塔回合搭建的应用而言,可以通过点击数据库列表旁侧提供的“管理”按钮进入到phpMyAdmin界面来进行直观的数据表管理和查询操作;而用于登录此工具所需的凭证即为之前创建相应数据库实例时指定的名字和密码组合[^3]。 #### Nginx重写规则调整 最后一步则是确保Nginx服务器能正确解析来自客户端发出的各种请求路径至ThinkPHP应用程序入口文件(`index.php`)。这可通过编辑目标域名对应的虚拟主机配置文档达成目的,向其中加入如下所示的一段指令片段: ```nginx location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=$1 last; break; } } ``` 上述代码的作用在于将不存在实际物理映射地址的所有HTTP请求统一转发给位于根目录下的`index.php`脚本处理,并附带原始URI参数传递过去以便于后续路由分发逻辑得以正常运转[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值