divineomega / laravel-extendable-basket
🛒 Laravel Extendable Basket 提供了几个抽象类,实现了基本的电子商务购物车功能
Requires
- php: >=7.1
- laravel/framework: ^5.5||^6.0||^7.0||^8.0||^9.0
Requires (Dev)
- doctrine/dbal: ^1.0||^2.0
- orchestra/testbench: ~5.0
- php-coveralls/php-coveralls: ^2.1
- phpunit/phpunit: ^8.0
README
Laravel Extendable Basket 提供了几个抽象类,实现了基本的电子商务购物车功能。这些类必须由您的应用程序扩展。
安装
只需使用 composer 安装最新版本。
composer require divineomega/laravel-extendable-basket
设置
为了使用此包,您需要执行各种设置步骤。
数据库表
需要两个数据库表来存储购物车和购物车项目数据。默认情况下,这些表分别命名为 baskets
和 basket_items
。此包提供数据库迁移来创建这些表。
要运行这些迁移,请输入以下 artisan 命令。
php artisan migrate
模型
现在您需要创建两个相关模型,一个用于存储购物车详细信息,一个用于存储购物车项目详细信息。下面显示了两个示例模型。根据需要,可以修改或添加这些模型。
创建一个购物车模型。
# app/Basket.php <?php namespace App; use DivineOmega\LaravelExtendableBasket\Models\Basket as BasketModel; class Basket extends BasketModel { public function items(): HasMany { return $this->hasMany('App\BasketItem'); } }
创建一个购物车项目模型。
# app/BasketItem.php <?php namespace App; use DivineOmega\LaravelExtendableBasket\Models\BasketItem as BasketItemModel; class BasketItem extends BasketItemModel { public function basket(): BelongsTo { return $this->belongsTo('App\Basket'); } }
Basketable 接口
可以放入此库提供的购物车中的任何内容都被认为是 'basketable'。您可以通过使任何现有的 Eloquent 模型实现 Basketable
接口来使其成为购物车化。
例如,如果您有一个 Product
模型,您可以按照以下方式更改它。
# app/Product.php <?php namespace App; use Illuminate\Database\Eloquent\Model; use DivineOmega\LaravelExtendableBasket\Interfaces\Basketable; class Product extends Model implements Basketable { // ... }
请注意,任何购物车化模型都必须有一个 getPrice()
和一个 getName()
方法,分别返回购物车化的数值价格和文本名称。
用法
本节描述了使用此包提供的购物车和购物车项目功能。它假设您已按上述方式执行了所需的安装和设置。
请记住,在需要的地方使用您创建的购物车和/或购物车项目模型。
获取当前购物车
在您的应用程序的任何地方,您都可以获取当前购物车。如果会话中当前没有购物车,则会创建一个。
$basket = Basket::getCurrent();
获取新购物车
如果您需要丢弃当前购物车并创建一个新的,例如在用户下单后,您可以使用 getNew
方法。
$basket = Basket::getNew();
此方法实际上同时起到清空购物车的作用。
手动购物车管理
静态方法 getCurrent
和 getNew
将当前购物车 ID 存储在会话中。如果您不希望这样做,您可以像处理任何 Eloquent 模型一样自行管理购物车。
// Get new basket $basket = new Basket(); // Get current basket $userBasketId = Auth::user()->basket_id; $basket = Basket::find($userBasketId);
向购物车添加项目
获取当前购物车后,您可以使用购物车的 add
方法轻松地向其中添加项目。您需要提供数量和任何购物车化模型。
可选地,您还可以提供一个包含购物车项目元数据的数组,这可能用于存储有关产品变体的信息。
$quantity = 5; $product = Product::FindOrFail(1); $basket->add($quantity, $product); $basket->add($quantity, $product, ['colour' => 'red', 'size' => 'medium']);
获取购物车项目
获取购物车中的项目和包含的项目模型可以很容易地完成。请参阅下面的示例。
foreach($basket->items as $item) { $product = $item->basketable; echo $product->name; }
更改购物车项目的数量
每个购物车项目都有一个与之关联的数量。它是在将项目添加到购物车时设置的,但可以通过 setQuantity
方法稍后修改。
$item = $basket->items->first(); $item->setQuantity($request->quantity);
移除购物车项目
购物车中的商品可以轻松删除,只需将其删除即可。以下是一个示例。
$item = $basket->items->first(); $item->delete();
获取购物车商品的单位成本
获取购物车商品的单位成本仅涉及调用与购物车商品关联的basketable模型的getPrice
方法。以下是一个示例。
$item = $basket->items->first(); $item->basketable->getPrice();
获取购物车商品的行总额
购物车商品类提供了一个getPrice
方法,用于获取行总额。这仅仅是basketable的价格乘以购物车商品的数量。以下示例代码展示了如何使用此方法。
$item = $basket->items->first(); $item->getPrice();
获取购物车中商品的总数量
购物车类中有一个方法可以汇总所有商品的数量。只需调用getTotalNumberOfItems
方法,如下所示。
$numItems = $basket->getTotalNumberOfItems();
获取购物车小计
购物车类提供了一个getSubtotal
方法,提供了购物车中所有商品的总计。以下是一个示例。
$subtotal = $basket->getSubtotal()
如果您想添加运费或折扣,您可以在购物车类中创建一个新的getTotal
方法。此方法可以调用getSubtotal
方法,然后以任何方式修改并返回它。
以下是一个实现这一想法的示例购物车类。
# app/Basket.php <?php namespace App; use DivineOmega\LaravelExtendableBasket\Models\Basket as BasketModel; class Basket extends BasketModel { public function items() { return $this->hasMany('App\BasketItem'); } public function getTotal() { $deliveryCost = 3.99; return $this->getSubtotal() + $deliveryCost; } }