You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 9项目实现addToCart功能求助:编写购物车添加逻辑

Laravel 9 电商项目添加购物车逻辑实现方案

以下是适配你现有代码的购物车实现步骤,基于会话(Session)存储(适合小型电商,若需持久化可后续扩展到数据库):


1. 添加路由

在 routes/web.php 中添加处理添加购物车的POST路由:

use App\Http\Controllers\CartController;

Route::post('/cart/add', [CartController::class, 'addToCart'])->name('cart.add');

2. 创建购物车控制器

生成CartController并实现核心逻辑:

php artisan make:controller CartController

在app/Http/Controllers/CartController.php中写入:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Product;

class CartController extends Controller
{
    public function addToCart(Request $request)
    {
        // 验证商品ID合法性
        $request->validate([
            'product_id' => 'required|exists:products,id'
        ]);

        $product = Product::find($request->product_id);
        $cart = session()->get('cart', []);

        // 判断商品是否已在购物车中
        if(isset($cart[$product->id])) {
            // 已存在则数量+1
            $cart[$product->id]['quantity']++;
        } else {
            // 不存在则新增商品记录
            $cart[$product->id] = [
                'title' => $product->title,
                'price' => $product->price,
                'image' => $product->image,
                'quantity' => 1
            ];
        }

        // 更新会话中的购物车数据
        session()->put('cart', $cart);
        
        // 返回原页面并提示成功
        return back()->with('success', '商品已添加到购物车!');
    }
}

3. 修改shop.blade.php中的添加按钮

将原空链接改为规范的POST表单,传递商品ID:

<div class="text-center py-4">
    <a class="h6 text-decoration-none text-truncate" href="http://localhost/e-commerce/public/shop/{{$product->id}}">{{$product->title}}</a>
    <div class="d-flex align-items-center justify-content-center mt-2">
        <h5>{{$product->price}}$</h5><h6 class="text-muted ml-2"><del>{{$product->old_price}}$</del></h6>
    </div>
    <div class="d-flex align-items-center justify-content-center mb-1">
        <small class="fa fa-star text-primary mr-1"></small>
        <small class="fa fa-star text-primary mr-1"></small>
        <small class="fa fa-star text-primary mr-1"></small>
        <small class="fa fa-star text-primary mr-1"></small>
        <small class="fa fa-star text-primary mr-1"></small>
        <small>(99)</small>
    </div>
    <!-- 替换原按钮为POST表单 -->
    <form action="{{ route('cart.add') }}" method="POST" class="d-inline">
        @csrf
        <input type="hidden" name="product_id" value="{{ $product->id }}">
        <button type="submit" class="btn btn-primary">Add to Cart</button>
    </form>
</div>

4. 可选:显示购物车商品数量

如果需要在页面导航栏等位置展示购物车总数量,可添加:

<!-- 示例:购物车图标旁的数量标记 -->
<span class="badge bg-danger">{{ count(session()->get('cart', [])) }}</span>

5. 可选:购物车详情页实现

若需展示购物车明细,可添加路由和对应方法:

// 路由
Route::get('/cart', [CartController::class, 'showCart'])->name('cart.show');

// CartController中的展示方法
public function showCart()
{
    $cart = session()->get('cart', []);
    // 计算购物车总价
    $total = array_sum(array_map(function($item) {
        return $item['price'] * $item['quantity'];
    }, $cart));
    
    return view('cart', compact('cart', 'total'));
}

内容的提问来源于stack exchange,提问作者dave_brown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:24:28