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

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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3
JaguarJack

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

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

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

11个月前 评论

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