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`异常,写入日志

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

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 3
JaguarJack

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

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

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

8个月前 评论

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