Siam博客

php一份代码分层规范

2021-09-06

控制器层

  • 事务开关
  • 调用Service Validata进行数据验证
  • 调用Process Service Do
    • Other Service Validata
    • Other Service Do
public function createOrder(Request $request)
    {
        DB::beginTransaction();
        try {
            $this->orderService->validatorCreateOrder($request);
            $goods = $this->orderService->validatorGoods($request);
            // 设置商品
            $this->orderProcessService->setGoods($goods);
            // 优惠码
            $coupon = $this->orderService->validatorCoupon($request);
            // 设置优惠码
            $this->orderProcessService->setCoupon($coupon);
            $otherIpt = $this->orderService->validatorChargeInput($goods, $request);
            $this->orderProcessService->setOtherIpt($otherIpt);
            // 数量
            $this->orderProcessService->setBuyAmount($request->input('by_amount'));
            // 支付方式
            $this->orderProcessService->setPayID($request->input('payway'));
            // 下单邮箱
            $this->orderProcessService->setEmail($request->input('email'));
            // ip地址
            $this->orderProcessService->setBuyIP($request->getClientIp());
            // 查询密码
            $this->orderProcessService->setSearchPwd($request->input('search_pwd', ''));
            // 创建订单
            $order = $this->orderProcessService->createOrder();
            DB::commit();
            // 设置订单cookie
            $this->queueCookie($order->order_sn);
            return redirect(url('/bill', ['orderSN' => $order->order_sn]));
        } catch (RuleValidationException $exception) {
            DB::rollBack();
            return $this->err($exception->getMessage());
        }
    }

Service层

  • Validata —— 数据有效性验证
  • Do —— 查询数据的封装 调用Model
  • 支持嵌套事务的框架 Service可做事务开关
public function validatorCoupon(Request $request):? Coupon
{
    // 如果提交了优惠码
    if ($request->filled('coupon_code')) {
        // 查询优惠码是否存在
        $coupon = $this->couponService->withHasGoods($request->input('coupon_code'), $request->input('gid'));
        // 此商品没有这个优惠码
        if (empty($coupon)) {
            throw new RuleValidationException(__('dujiaoka.prompt.coupon_does_not_exist'));
        }
        // 剩余次数不足
        if ($coupon->ret <= 0) {
            throw new RuleValidationException(__('dujiaoka.prompt.coupon_lack_of_available_opportunities'));
        }
        return $coupon;
    }
    return null;
}
public function withGoodsByAmountAndStatusUnsold(int $goodsID, int $byAmount)
{
    $carmis = Carmis::query()
        ->where('goods_id', $goodsID)
        ->where('status', Carmis::STATUS_UNSOLD)
        ->take($byAmount)
        ->get();
    return $carmis ? $carmis->toArray() : null;
}

Process Service层

复杂的逻辑,有进度的 ,比如功能的审批、比如订单的创建这种影响比较大的链条式请求

  • 调用Service
  • Save Data To Do Process —— 保存数据 进行处理
  • 支持嵌套事务的框架 Process Service可做事务开关
// ip地址
$this->orderProcessService->setBuyIP($request->getClientIp());
// 查询密码
$this->orderProcessService->setSearchPwd($request->input('search_pwd', ''));
// 创建订单
$order = $this->orderProcessService->createOrder();

Job层

任务层,如发送邮件任务,发送接口请求任务(ERP等),入队任务

Model层

对数据的自动化进行设置,不进行封装 如 getByIds等,封装到逻辑中 - 时间戳自动更新 - 格式自动转化 - 附加字段 - 关联关系

实例举例

酒吧系统: 下单 - 控制器 - - 事务 - - 调用GoodsService验证 店铺、商品有效性(商品id有效性、是否属于当前店铺、是否下架等) - - 调用OrderProcessService,进行订单进程性处理,setStaff员工信息,setGoods下单商品信息,setTable信息等 - - OrderProcessService 调用 OrderService 进行订单插入,调用GoodsService 进行库存减少,调用TableService进行统计信息更新等 - - - 调用Job层,进行ERP信息推送对接 - - - 调用Job层,进行小票任务推送 - - 请求结束,事务、响应

本文链接:
版权声明: 本文由 Siam原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
Tags: PHP

扫描二维码,分享此文章