求大神们指点我的屎山代码,给出优化思路!谢谢!
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,
]);
}
5个回答
写的不错啊,能看懂,这证明它并不是屎山屙
亲人啊~~ 太欣慰了.....
$redis_key = $param['mobile'].':*'; 这个是疏忽,下次一定注意,的确没用到。
array_walk 我学会了。谢谢大神!
兄弟你这代码 不错了,结构清晰 逻辑清晰,还有简单的注释,你是真没见过屎山代码呀
大神,我觉得我写的好屎,因为我感觉一个方法里太多内容了,我觉得阅读起来复杂。
$userinfo 的数据可以放在 Context 中,定义几个助手函数来获取
userInfo、userId、userMobile
等数据$param 不必一个个构建,可以直接
$param = $request->all()
statusCode 不要放在配置中,可以用枚举或者类常量,这样子会有代码提示
定义并调用一个统一的返回方法,可以只传 code,在方法里通过 code 获取对应的 message
感谢,2 里的 ->all() 方法,是 get 和 post 都获取,我这浅薄的知识感觉不安全。
真强啊 我只会 find 然后 if create 或者 update 逐条 操作