laravel中如何优雅使用事务,以及记录错误日志?

需求

在控制器中使用事务处理,当发生SQL执行异常时需要回滚,同时在Exceptions\Handler.php中统一拦截异常并写入日志

控制器代码

    /**
     * 批量设置回访
     * @param CustomerBatchRequest $request
     * @return JsonResponse
     */
    public function followup(CustomerBatchRequest $request): JsonResponse
    {
        $ids   = $request->input('ids', []);
        $isall = $request->input('isall', false);

        DB::beginTransaction();
        try {

            // 勾选部分顾客更新
            if (!empty($ids) && !$isall) {
                $request->setFollowupByIds();
            }

            // 全选设置回访
            if (empty($ids) && $isall) {
                $request->setFollowupByAll();
            }

            DB::commit();
            return response_success();

        } catch (Exception $e) {
            DB::rollBack();
            // 抛出 throw $e;
            return response_error($e->getMessage());
        }
    }

异常拦截 App\Exceptions\Handler.php

拦截`throw $e`异常,写入日志

目前的处理方式感觉不够优雅,请问大家在项目中是如何处理类似需求的?希望能够分享一些经验和最佳实践,谢谢!

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3
JaguarJack

给异常加个名字,例如 throw new RollBackException,然后在 Handle 处理啊

if ($e instanceof RollbackException) {
// 记录日志 
}
6个月前 评论
91it (楼主) 6个月前

Laravel 有一个 \Illuminate\Database\Events\TransactionRolledBack 事件,可以 listen 这个事件去写日志

6个月前 评论

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