Skip to content

Commit

Permalink
封装业务代码
Browse files Browse the repository at this point in the history
  • Loading branch information
summerblue committed Mar 9, 2021
1 parent e308978 commit d738d09
Showing 4 changed files with 132 additions and 83 deletions.
40 changes: 15 additions & 25 deletions app/Http/Controllers/CartController.php
Original file line number Diff line number Diff line change
@@ -4,47 +4,37 @@

use Illuminate\Http\Request;
use App\Http\Requests\AddCartRequest;
use App\Models\CartItem;
use App\Models\ProductSku;
use App\Services\CartService;

class CartController extends Controller
{
public function add(AddCartRequest $request)
{
$user = $request->user();
$skuId = $request->input('sku_id');
$amount = $request->input('amount');

// 从数据库中查询该商品是否已经在购物车中
if ($cart = $user->cartItems()->where('product_sku_id', $skuId)->first()) {

// 如果存在则直接叠加商品数量
$cart->update([
'amount' => $cart->amount + $amount,
]);
} else {

// 否则创建一个新的购物车记录
$cart = new CartItem(['amount' => $amount]);
$cart->user()->associate($user);
$cart->productSku()->associate($skuId);
$cart->save();
}
protected $cartService;

return [];
// 利用 Laravel 的自动解析功能注入 CartService 类
public function __construct(CartService $cartService)
{
$this->cartService = $cartService;
}

public function index(Request $request)
{
$cartItems = $request->user()->cartItems()->with(['productSku.product'])->get();
$cartItems = $this->cartService->get();
$addresses = $request->user()->addresses()->orderBy('last_used_at', 'desc')->get();

return view('cart.index', ['cartItems' => $cartItems, 'addresses' => $addresses]);
}

public function add(AddCartRequest $request)
{
$this->cartService->add($request->input('sku_id'), $request->input('amount'));

return [];
}

public function remove(ProductSku $sku, Request $request)
{
$request->user()->cartItems()->where('product_sku_id', $sku->id)->delete();
$this->cartService->remove($sku->id);

return [];
}
63 changes: 5 additions & 58 deletions app/Http/Controllers/OrdersController.php
Original file line number Diff line number Diff line change
@@ -3,72 +3,19 @@
namespace App\Http\Controllers;

use App\Http\Requests\OrderRequest;
use App\Models\ProductSku;
use App\Models\UserAddress;
use App\Models\Order;
use Carbon\Carbon;
use App\Exceptions\InvalidRequestException;
use App\Jobs\CloseOrder;
use Illuminate\Http\Request;
use App\Services\OrderService;

class OrdersController extends Controller
{
public function store(OrderRequest $request)
public function store(OrderRequest $request, OrderService $orderService)
{
$user = $request->user();
// 开启一个数据库事务
$order = \DB::transaction(function () use ($user, $request) {
$address = UserAddress::find($request->input('address_id'));
// 更新此地址的最后使用时间
$address->update(['last_used_at' => Carbon::now()]);
// 创建一个订单
$order = new Order([
'address' => [ // 将地址信息放入订单中
'address' => $address->full_address,
'zip' => $address->zip,
'contact_name' => $address->contact_name,
'contact_phone' => $address->contact_phone,
],
'remark' => $request->input('remark'),
'total_amount' => 0,
]);
// 订单关联到当前用户
$order->user()->associate($user);
// 写入数据库
$order->save();
$user = $request->user();
$address = UserAddress::find($request->input('address_id'));

$totalAmount = 0;
$items = $request->input('items');
// 遍历用户提交的 SKU
foreach ($items as $data) {
$sku = ProductSku::find($data['sku_id']);
// 创建一个 OrderItem 并直接与当前订单关联
$item = $order->items()->make([
'amount' => $data['amount'],
'price' => $sku->price,
]);
$item->product()->associate($sku->product_id);
$item->productSku()->associate($sku);
$item->save();
$totalAmount += $sku->price * $data['amount'];
if ($sku->decreaseStock($data['amount']) <= 0) {
throw new InvalidRequestException('该商品库存不足');
}
}

// 更新订单总金额
$order->update(['total_amount' => $totalAmount]);

// 将下单的商品从购物车中移除
$skuIds = collect($items)->pluck('sku_id');
$user->cartItems()->whereIn('product_sku_id', $skuIds)->delete();

return $order;
});

$this->dispatch(new CloseOrder($order, config('app.order_ttl')));

return $order;
return $orderService->store($user, $address, $request->input('remark'), $request->input('items'));
}

public function index(Request $request)
43 changes: 43 additions & 0 deletions app/Services/CartService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

namespace App\Services;

use Auth;
use App\Models\CartItem;

class CartService
{
public function get()
{
return Auth::user()->cartItems()->with(['productSku.product'])->get();
}

public function add($skuId, $amount)
{
$user = Auth::user();
// 从数据库中查询该商品是否已经在购物车中
if ($item = $user->cartItems()->where('product_sku_id', $skuId)->first()) {
// 如果存在则直接叠加商品数量
$item->update([
'amount' => $item->amount + $amount,
]);
} else {
// 否则创建一个新的购物车记录
$item = new CartItem(['amount' => $amount]);
$item->user()->associate($user);
$item->productSku()->associate($skuId);
$item->save();
}

return $item;
}

public function remove($skuIds)
{
// 可以传单个 ID,也可以传 ID 数组
if (!is_array($skuIds)) {
$skuIds = [$skuIds];
}
Auth::user()->cartItems()->whereIn('product_sku_id', $skuIds)->delete();
}
}
69 changes: 69 additions & 0 deletions app/Services/OrderService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?php

namespace App\Services;

use App\Models\User;
use App\Models\UserAddress;
use App\Models\Order;
use App\Models\ProductSku;
use App\Exceptions\InvalidRequestException;
use App\Jobs\CloseOrder;
use Carbon\Carbon;

class OrderService
{
public function store(User $user, UserAddress $address, $remark, $items)
{
// 开启一个数据库事务
$order = \DB::transaction(function () use ($user, $address, $remark, $items) {
// 更新此地址的最后使用时间
$address->update(['last_used_at' => Carbon::now()]);
// 创建一个订单
$order = new Order([
'address' => [ // 将地址信息放入订单中
'address' => $address->full_address,
'zip' => $address->zip,
'contact_name' => $address->contact_name,
'contact_phone' => $address->contact_phone,
],
'remark' => $remark,
'total_amount' => 0,
]);
// 订单关联到当前用户
$order->user()->associate($user);
// 写入数据库
$order->save();

$totalAmount = 0;
// 遍历用户提交的 SKU
foreach ($items as $data) {
$sku = ProductSku::find($data['sku_id']);
// 创建一个 OrderItem 并直接与当前订单关联
$item = $order->items()->make([
'amount' => $data['amount'],
'price' => $sku->price,
]);
$item->product()->associate($sku->product_id);
$item->productSku()->associate($sku);
$item->save();
$totalAmount += $sku->price * $data['amount'];
if ($sku->decreaseStock($data['amount']) <= 0) {
throw new InvalidRequestException('该商品库存不足');
}
}
// 更新订单总金额
$order->update(['total_amount' => $totalAmount]);

// 将下单的商品从购物车中移除
$skuIds = collect($items)->pluck('sku_id')->all();
app(CartService::class)->remove($skuIds);

return $order;
});

// 这里我们直接使用 dispatch 函数
dispatch(new CloseOrder($order, config('app.order_ttl')));

return $order;
}
}

0 comments on commit d738d09

Please sign in to comment.