0

0

详解Laravel模型事件的两种方式

藏色散人

藏色散人

发布时间:2021-07-23 15:03:05

|

3107人浏览过

|

来源于segmentfault

转载

在日常处理一些用户操作事件时,我们有时候需要记录下来,方便以后查阅,或者大数据统计。


Laravel 在模型事件中处理起来很方便:https://laravel-china.org/docs/laravel/5.5/eloquent#events


Laravel 的模型事件有两种方式,

  • 设置dispatchesEvents属性映射事件类
  • 使用观察器来注册事件,这里介绍第二种
  • 新建模型

php artisan make:model Log

  • 创建迁移表:

php artisan make:migration create_logs_table

  • 表的结构大概是这样,可按需设计
engine = 'InnoDB';
            $table->increments('id');
            $table->string('user_id')->comment('操作人的ID');
            $table->string('user_name')->comment('操作人的名字,方便直接查阅');
            $table->string('url')->comment('当前操作的URL');
            $table->string('method')->comment('当前操作的请求方法');
            $table->string('event')->comment('当前操作的事件,create,update,delete');
            $table->string('table')->comment('操作的表');
            $table->string('description')->default('');
            $table->timestamps();
        });

        DB::statement("ALTER TABLE `logs` comment '操作日志表'");
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('logs');
    }
}
  • 运行迁移生成表

php artisan migrate

  • 新建一个服务提供者统一注册所有的模型事件观察器(后面的名字可以自己起得形象一点)

php artisan make:provider ObserverLogServiceProvider

  • /config/app.php中的providers数组注册(大概如图中)

b2ad5e3c119b1213a822ef7b976a30d.png

  • app目录下新建文件夹Observers存放模型观察器,并新建基类LogBaseServer并在构造函数构建基本属性(CLI是因为在命令行执行时不存在用户执行)

61267a12797ec26605765c4b73e3fc6.png

  • 新建一个观察器继承基类LogBaseServerUser模型,方法的名字要对应文档中的事件)

bcbc9c856162376f328a5ccdf5db942.png

  • 到新建的服务提供者ObserverLogServiceProvider中运行

db1c90b0ffb965d11c7b07664f58322.png

  • 为需要的模型注册事件(我这挺多的,之后大概长这样)

3214b762f1eefb0360e0c89e59bf4cf.png

  • 然后我们触发一些事件(增删改,表的数据就有了)

675bb3d6d62b9414590757596a6b6ec.png


  • 多对多的关联插入不会出触发模型(比如attach方法)
  • 这时候就需要自己新建事件类来模拟(这里拿分配权限给角色粗略说一下)

1.在EventServiceProvider中的listen属性绑定好事件

023e119647c0fecdd737e71dd57ccc4.png

2.事件PermissionRoleEvent中的注入两个参数,一个是角色,另一个是attach或者detach返回的数组

dd5760b2d5605ece6567a0bc72bdbf0.png

3.事件监听器PermissionRoleEventLog也继承基类LogBaseServer,这里就是根据传入的数组id遍历,然后创建日志

78d05bbd840a11b18eafec4aea629dc.png

4.之后应用事件

82821acbffec3f624d392f5b2ccb3b4.png


  • 更优雅的处理登录注销事件

1.在EventServiceProvider中的subscribe属性绑定好处理的类

105aab511e2973bc9c77b1545d65113.png

2.事件监听类的方法

5b150ce1f8ee8b5ba4192ac7209ba76.png

3.之后的效果就是这样了:

b8dd1af2d50c7a0891c360074bcc986.png

相关推荐:最新的五个Laravel视频教程

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

4

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

3

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

10

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

15

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

42

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

7

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

9

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

6

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 7.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号