求大神们指点我的屎山代码,给出优化思路!谢谢!

andyzu
    public function getVenueOrderinfoFromType(Request $request, int $type){
        // 获取 TokenVerifyMiddleware 里已经解密好的用户数据
        $userinfo = $request->data;

        $param = [
            'page' => $request->input('page', 1),
            'perPage' => $request->input('perPage', 10),
            'mobile' => $request->get('mobile'),
            'venueinfo_type' => $request->get('venueinfo_type'),
            'type' => $type,
        ];

        // 进行参数校验
        $validate = new GetVenueOrderinfoFromTypeValidate();
        if (!$validate->check($param)) {
            return json($validate->getError());
        }

        // 去除传递过来参数的前后空格
        $param = array_map('trim', $param);
        if ($param['mobile'] != $userinfo['mobile']){
            return json([
                // 'HTTP_FAIL_REQUEST' => [200112, '非法请求,请确认请求者身份。'],
                'code' => config('myconfig.statusCode.HTTP_FAIL_REQUEST')[0],
                'msg' => config('myconfig.statusCode.HTTP_FAIL_REQUEST')[1],
                'data' => [],
            ]);
        }

        // 从 redis 里获取 待付款的数据
        if ($param['type'] == 0){
            Redis::select(1);
            $redis_key = $param['mobile'].':*';
            $redis_keys = Redis::keys($param['mobile'].':*');
            $data = [];
            foreach ($redis_keys as $key) {
                $data[$key] = json_decode(Redis::get($key),true);
                $data[$key]['button']['支付'] = true;
            }

            return json([
                // 'HTTP_OK' => [200100, '请求成功'],
                'code' => config('myconfig.statusCode.HTTP_OK')[0],
                'msg' => config('myconfig.statusCode.HTTP_OK')[1],
                'data' => $data,
            ]);
        }

        $venueOrderinfo = Db::table('venue_orderinfo')
            ->where('type', '=', $param['type'])
            ->where('venueinfo_type', '=', $param['venueinfo_type'])
            ->whereNull('deleted_at')
            ->get()
            ->forPage($param['page'], $param['perPage'])
            ->map(function ($res) {
                $res->order_time_fieldTrans = date('Y-m-d H:i:s', $res->order_time);
                $res->type_fieldTrans = trans('venue_orderinfo_type.' . $res->type);
                // 订单类型(0=待支付,1=待入场,2=已完成,3=已退款)
                if ($res->type == 0){
                    $res->button[0]['title'] = '支付';
                    $res->button[0]['is_enabled'] = true;
                    $res->button[0]['url'] = 'api/v1/wechatpay/payOrderinfo';
                    $res->button[0]['type'] = $res->type;
                }

                if ($res->type == 1){
                    $res->button[0]['title'] = '查看二维码';
                    $res->button[0]['is_enabled'] = true;
                    $res->button[0]['url'] = 'api/v1/wechatpay/chakanerweima';
                    $res->button[0]['type'] = $res->type;

                    // 查询退款的时限
                    $refundinfo = Db::table('refundinfo')
                        ->whereNull('deleted_at')
                        ->first();
                    $refund_time = $refundinfo->refund_time * 3600;     // 单位是小时 * 3600 就是秒数
                    // 可以退款的最后时限 UNIX时间戳
                    $is_refund_time = $res->order_time - $refund_time;
                    // 如果当前时间小于退款时间,那说明可以退款,否则不能退款
                    if (time() < $is_refund_time){
                        $res->button[1]['title'] = '查看二维码';
                        $res->button[1]['is_enabled'] = true;
                        $res->button[1]['url'] = 'api/v1/wechatpay/tuikuan';
                        $res->button[1]['type'] = $res->type;

                    }else{
                        $res->button[1]['title'] = '已过退款时限';
                        $res->button[1]['is_enabled'] = false;
                    }

                }
                // TODO 还得在后台上传电子发票
                if ($res->type == 2){
                    $res->button[0]['title'] = '开发票';
                    $res->button[0]['is_enabled'] = true;
                    $res->button[0]['url'] = '';
                    $res->button[0]['type'] = $res->type;
                }

                if ($res->type == 3){
                    $res->button[0]['title'] = '稍后讨论';
                    $res->button[0]['is_enabled'] = true;
                    $res->button[0]['url'] = 'api/v1/wechatpay/shaohoutaolun';
                    $res->button[0]['type'] = $res->type;
                }
                return $res;
            })->toArray();

        $venueOrderinfo = array_values($venueOrderinfo) ?? [];

        return json([
            // 'HTTP_OK' => [200100, '请求成功'],
            'code' => config('myconfig.statusCode.HTTP_OK')[0],
            'msg' => config('myconfig.statusCode.HTTP_OK')[1],
            'data' => $venueOrderinfo,
        ]);
    }
981 5 1
5个回答

咸鱼.php

写的不错啊,能看懂,这证明它并不是屎山屙

胡桃
// ...
Redis::select(1);
$redis_key = $param['mobile'].':*'; // 只使用一次的变量没有必要单独赋值,而且这个`$redis_key`后面没用到
$redis_keys = Redis::keys($param['mobile'].':*');
// ...

// 循环使用get是一大忌,建议改成mget
$data = array_combine($redis_keys, Redis::mget($redis_keys));
array_walk($data, function (&$v, $k) {
    $v = json_decode($v, true);
    $v['button']['支付'] = true;
});
  • andyzu 2023-12-07

    $redis_key = $param['mobile'].':*'; 这个是疏忽,下次一定注意,的确没用到。

  • andyzu 2023-12-07

    array_walk 我学会了。谢谢大神!

tanhongbin

兄弟你这代码 不错了,结构清晰 逻辑清晰,还有简单的注释,你是真没见过屎山代码呀

  • andyzu 2023-12-07

    大神,我觉得我写的好屎,因为我感觉一个方法里太多内容了,我觉得阅读起来复杂。

Chance
  1. $userinfo 的数据可以放在 Context 中,定义几个助手函数来获取 userInfo、userId、userMobile 等数据

  2. $param 不必一个个构建,可以直接 $param = $request->all()

  3. statusCode 不要放在配置中,可以用枚举或者类常量,这样子会有代码提示

  4. 定义并调用一个统一的返回方法,可以只传 code,在方法里通过 code 获取对应的 message

  • andyzu 2023-12-20

    感谢,2 里的 ->all() 方法,是 get 和 post 都获取,我这浅薄的知识感觉不安全。

kspade

真强啊 我只会 find 然后 if create 或者 update 逐条 操作

  • 暂无评论
×
🔝