通过Session实现Laravel购物车功能,首先创建Product模型与迁移并添加测试数据,接着构建Cart服务类管理添加、更新、删除等操作,再通过CartController处理请求,定义相应路由,并创建视图展示购物车内容,最终实现一个轻量可扩展的临时购物车系统。

实现一个简单的购物车功能在 Laravel 中并不复杂。通过 Session 存储购物车数据,可以快速构建适用于小型电商或展示类项目的购物车系统。以下是基于 Laravel 的简单购物车实现方法。
1. 创建商品模型和迁移
假设我们有一个商品表,先生成模型和迁移文件:
php artisan make:model Product -m
在生成的迁移文件中定义字段:
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->decimal('price', 8, 2);
$table->text('description')->nullable();
$table->timestamps();
});
运行迁移:
php artisan migrate
2. 添加测试商品数据
使用 Seeder 添加几条测试商品:
php artisan make:seeder ProductSeeder
在 ProductSeeder.php 中添加:
Product::create([
'name' => 'T-shirt',
'price' => 29.99,
'description' => 'Cotton T-shirt'
]);
运行 Seeder:
php artisan db:seed --class=ProductSeeder
3. 创建购物车服务类
创建一个 Cart 类来管理购物车逻辑:
一套自选网上商城精美模版,自主商品管理,自行网店经营的网上商城平台,系统具有强大的商品管理、购物车、订单统计、会员管理等功能,同时拥有灵活多变的商品管理、新闻管理等功能,功能强劲的后台管理界面,无需登录FTP,通过IE浏览器即可管理整个网站。西亚购物平台经多方面权威调查和研究为您精心开发了很多特色实用功能。使商品展示、管理、服务全面升级。西亚购物平台为您提供了多款专业美观的店面样式、俱备完整的购物
// app/Services/Cart.php namespace App\Services;class Cart { public function get() { return session()->get('cart', []); }
public function add($product, $quantity = 1) { $cart = $this->get(); $id = $product->id; if(isset($cart[$id])) { $cart[$id]['quantity'] += $quantity; } else { $cart[$id] = [ 'id' => $product->id, 'name' => $product->name, 'price' => $product->price, 'quantity' => $quantity ]; } session(['cart' => $cart]); } public function update($id, $quantity) { $cart = $this->get(); if(isset($cart[$id])) { $cart[$id]['quantity'] = $quantity; session(['cart' => $cart]); } } public function remove($id) { $cart = $this->get(); unset($cart[$id]); session(['cart' => $cart]); } public function clear() { session()->forget('cart'); } public function getTotal() { $total = 0; foreach($this->get() as $item) { $total += $item['price'] * $item['quantity']; } return $total; }}
4. 创建控制器处理购物车操作
生成控制器:
php artisan make:controller CartController
在 CartController.php 中注入 Cart 服务:
use App\Services\Cart; use App\Models\Product;public function index(Cart $cart) { return view('cart.index', ['items' => $cart->get(), 'total' => $cart->getTotal()]); }
public function add(Cart $cart, $id) { $product = Product::findOrFail($id); $cart->add($product); return redirect()->route('cart.index')->with('success', '商品已加入购物车'); }
public function update(Cart $cart, $id) { $quantity = request('quantity', 1); $cart->update($id, $quantity); return redirect()->route('cart.index'); }
public function remove(Cart $cart, $id) { $cart->remove($id); return redirect()->route('cart.index'); }
5. 定义路由
在 routes/web.php 中添加:
Route::prefix('cart')->group(function () {
Route::get('/', [CartController::class, 'index'])->name('cart.index');
Route::post('/add/{id}', [CartController::class, 'add'])->name('cart.add');
Route::post('/update/{id}', [CartController::class, 'update'])->name('cart.update');
Route::post('/remove/{id}', [CartController::class, 'remove'])->name('cart.remove');
});
6. 创建视图文件
创建 resources/views/cart/index.blade.php:
购物车
-
@foreach($items as $id => $item)
- {{ $item['name'] }} - ¥{{ $item['price'] }} x 删除 @endforeach
总计:¥{{ number_format($total, 2) }}
基本上就这些。这个方案使用 Session 存储购物车数据,适合未登录用户临时使用。如需持久化,可将购物车数据保存到数据库并关联用户 ID。当前实现轻量、清晰,便于扩展。









