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 协议》,转载必须注明作者和本文链接
推荐文章: