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

发布时间 - 2021-07-23 00:00:00    点击率:

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


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


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

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

php artisan make:model Log

ss Log extends Model
{
    protected $fillable = ['user_name', 'user_id', 'url', 'event', 'method', 'table', 'description'];
}
  • 创建迁移表:

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数组注册(大概如图中)

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

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

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

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

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


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

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

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

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

4.之后应用事件


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

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

2.事件监听类的方法

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

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


# php  # laravel  # 绑定  # 新建一个  # 是因为  # 是这样  # 遍历  # 我这  # 并在  # 不存在  # 要对  # 有两种 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  西安专业网站制作公司有哪些,陕西省建行官方网站?  nginx修改上传文件大小限制的方法  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  php485函数参数是什么意思_php485各参数详细说明【介绍】  高防服务器租用指南:配置选择与快速部署攻略  微信推文制作网站有哪些,怎么做微信推文,急?  Internet Explorer官网直接进入 IE浏览器在线体验版网址  php 三元运算符实例详细介绍  Laravel如何实现一对一模型关联?(Eloquent示例)  制作旅游网站html,怎样注册旅游网站?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  js代码实现下拉菜单【推荐】  javascript基本数据类型及类型检测常用方法小结  做企业网站制作流程,企业网站制作基本流程有哪些?  如何在Ubuntu系统下快速搭建WordPress个人网站?  如何用免费手机建站系统零基础打造专业网站?  如何快速查询域名建站关键信息?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  如何用美橙互联一键搭建多站合一网站?  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  python中快速进行多个字符替换的方法小结  javascript读取文本节点方法小结  iOS中将个别页面强制横屏其他页面竖屏  大连网站制作公司哪家好一点,大连买房网站哪个好?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  Laravel中的Facade(门面)到底是什么原理  Laravel如何使用.env文件管理环境变量?(最佳实践)  Linux网络带宽限制_tc配置实践解析【教程】  如何在阿里云高效完成企业建站全流程?  Laravel如何处理和验证JSON类型的数据库字段  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  JavaScript如何实现错误处理_try...catch如何捕获异常?  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  网易LOFTER官网链接 老福特网页版登录地址  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  如何用景安虚拟主机手机版绑定域名建站?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  如何在万网自助建站平台快速创建网站?  Laravel如何使用Blade组件和插槽?(Component代码示例)  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  北京的网站制作公司有哪些,哪个视频网站最好?  什么是javascript作用域_全局和局部作用域有什么区别?