Laravel eloquent 的事务与事件

说明

laravel 的 Eloquent ORM 的事件机制,为我们提供了一种解耦代码的可能性,但是,如果在一个事务中触发其对应的事件时,无论事务最后是否 commit ,其对应的事件都会被触发,这样在处理业务逻辑的情况下会导致一些问题;

事件触发其他 SQL 更新

User::updated(function( User $user) {
    $logs = [];
    if ( $user->isDirty('city') ) {
        $logs[] = '将城市设置为' . $user->city;
    }

    if ( $user->isDirty('address') ) {
        $logs[] = '将地址设置为' . $user->address;
    }

    // 保存日志
    $log = new UserLog;
    $log->user_id = $user->id;
    $log->log = implode('、', $logs);
    $log->save();
}

分析

以上代码其功能为:当用户更新自己的城市、地址信息时,同时将日志保存起来。

在业务逻辑代码部分,在更新用户信息时是开启事务的,Eloquent 在调用 save 时,触发 updated 事件,事件同步被执行,所以最后是否保存到数据库取决于业务逻辑部分的 commit/rollBack 。因此在这块可以恰好做到数据一致性。




触发其它业务逻辑

User::created(function( User $user) {

    // 发送邮件

    // 发送用户短信

    // 通知数据模块,通过队列等其他异步逻辑

});

分析

以上代码其功能为:当用户完成注册逻辑时,触发其他业务逻辑,比如:发送短信、发送邮箱、数据模块同步

在业务逻辑代码部分,用户注册是开启事务的,当调用 Eloquent 的 save 方法时,会触发 created 事件,事件会同步执行,所以上述代码会被正常执行,但是如果在业务逻辑部分出错,导致事务回滚( rollBack ),但事件部分代码逻辑却被触发了,所以这里会有一些坑,需要注意。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!