divineomega/laravel-extendable-basket

🛒 Laravel Extendable Basket 提供了几个抽象类,实现了基本的电子商务购物车功能

v4.0.0 2023-07-26 09:00 UTC

This package is auto-updated.

Last update: 2024-08-26 11:14:17 UTC


README

Build Status Coverage Status StyleCI

Laravel Extendable Basket 提供了几个抽象类,实现了基本的电子商务购物车功能。这些类必须由您的应用程序扩展。

安装

只需使用 composer 安装最新版本。

composer require divineomega/laravel-extendable-basket

设置

为了使用此包,您需要执行各种设置步骤。

数据库表

需要两个数据库表来存储购物车和购物车项目数据。默认情况下,这些表分别命名为 basketsbasket_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();

此方法实际上同时起到清空购物车的作用。

手动购物车管理

静态方法 getCurrentgetNew 将当前购物车 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;
    }
}