电子商务购物车包

dev-master 2018-04-11 10:12 UTC

This package is not auto-updated.

Last update: 2024-09-20 03:52:25 UTC


README

为 Laravel 构建的一个简单的购物车。

安装

  1. 下载此存储库并将其放置在 packages

  2. 将路径添加到 composer.json

composer require damjangkae/cart
  1. 将以下行添加到 config/app.php
  • providers 数组中
Damjangkae\Cart\CartServiceProvider::class
  • aliases 数组中
'Cart' => Damjangkae\Cart\Facades\Cart::class
  1. 执行 composer dump-autoload

完成。

概述

查看以下主题之一以了解有关 LaravelShoppingcart 的更多信息

用法

以下是提供的方法

Cart::add()

$book = Book::find(1);
Cart::add($book);

通过模型 Book 必须实现 Damjangkae\Cart\Contracts\Buyable,它需要以下方法

public function getIdentifier();
public function getPrice(): float;

函数 getIdentifier() 预期模型返回 ID 或使您的项目独特的某些内容。

使用 add() 的另一种可选方式。

使用可选参数

Cart::add($book, 2, 100, ['author' => 'John Doe']);

或作为次要参数的数组中的参数

Cart::add($book, [
    'quantity' => 2,
    'price' => 100,
    'attributes' => ['author' => 'John Doe']
]);

Cart::update()

要更新购物车中的项目,您必须指定标识符。

$identifier = '9790404436093';
Cart::update($identifier, 2);

使用 update() 将现有数据覆盖为新的,与依赖于现有数据的 add() 不同。示例

Cart::add($book1, 2);
Cart::update($book1, 3);
// The total will be 3

Cart::add($book2, 2);
Cart::add($book2, 3);
// The total will be 5

使用 update() 的另一种方式。

add() 做的相同。

Cart::update($identifier, ['price' => 900]);

Cart::remove()

$identifier = '9790404436093';
Cart::remove($identifier);

注意:将项目数量更新为 0 与 remove() 有相同的结果。

Cart::find()

update()remove() 一样简单

$identifier = '9790404436093';

Cart::find($identifier);

Damjangkae\Cart\Exceptions\ItemNotFoundException 将在项目不存在时抛出。

Cart::items()

返回购物车中的项目集合

Cart::items();

Cart::destroy()

删除购物车对象。

Cart::destroy();

Cart::subtotal()

返回小计价格。

Cart::subtotal();

Cart::total()

Cart::subtotal();

Cart::count()

按类型返回项目数量。 2 本书和 3 把椅子将返回 2

Cart::count();

Cart::quantity()

按所有数量的项目返回项目数量。 2 本书和 3 把椅子将返回 5

Cart::quantity();

Cart::isEmpty()

如果购物车没有项目,则返回 true

Cart::isEmpty();

Cart::search()

传递闭包函数并执行您的操作。

Cart::search(function (CartItem $cartItem) {
	return $cartItem->price > 1000;
});

注意:返回的结果在集合中。

集合

大多数方法都返回为集合(Illuminate\Support\Collection),所以您知道该怎么做。

Cart::items()->first();
Cart::search(function (CartItem $cartItem) {
	return $cartItem->price > 1000;
})->count();

请参阅 Laravel 的集合以获取更多信息:[https://laravel.net.cn/docs/master/collections](https://laravel.net.cn/docs/master/collections)

实例

您可能希望在同一会话中拥有多个购物车实例,这里是解决方案。

$book1 = Book::find(1);
$book2 = Book::find(2);

Cart::instance('gift')->add($book1);
Cart::instance('wishlist')->add($book2);

Cart::instance('gift')->items()->first(); // book1
Cart::instance('wishlist')->items()->first(); // book2

注意:如果未设置实例名称,则默认值为以 default 预先添加的 cart_。因此,如果您将实例名称设置为 wishlist,则会话名称将为 cart_whishlist

条件

每个电子商务都有一项促销活动,因此让购物车在幕后做这项工作。

首先:创建您的条件类。

如果您的条件会影响 总价格,请确保您实现了 Damjangkae\Cart\Conditions\TotalAffectable,但如果您的条件会影响 项目,则必须实现 Damjangkae\Cart\Conditions\ItemAffectable

**示例**:如果您想对订单小计超过 500 的客户提供 10% 的折扣。

<?php

use Damjangkae\Cart\Cart;
use Damjangkae\Cart\Conditions\TotalAffectable;

class TenPercentOffIfSubtotalOver500Baht implements TotalAffectable
{
    public function allow(Cart $cart): bool
    {
        return true;
    }

    public function active(Cart $cart): bool
    {
        return $cart->subtotal > 500;
    }

    public function getDiscount(Cart $cart): float
    {
        return $cart->subtotal * .1;
    }
}

如您所见,您必须实现 3 个方法,它们是

  • allow() 预期您返回一个布尔值,如果返回 true,则此条件可以添加到购物车中。如果返回 false,则将抛出 Damjangkae\Cart\Exceptions\ConditionIsNotAllowToAddException

  • active() 预期您返回一个布尔值,如果返回 true,则此条件是活动的。

  • getDiscount() 预期您返回一个浮点数,这将是小计的折扣。

示例:如果您希望如果客户购物车中有这本书,就免费赠送另一本书。

<?php

use Damjangkae\Cart\Cart;
use Damjangkae\Cart\CartItem;
use Damjangkae\Cart\Conditions\ItemAffectable;

class FreeAnotherBookIfTheBookInCart implements ItemAffectable
{
    public function allow(Cart $cart): bool
    {
        return true;
    }

    public function active(Cart $cart): bool
    {
        $book = App\Book::find(1);
        
        return $cart->items->has($book->getItentifier());
    }

    public function getItem(Cart $cart): CartItem
    {
        $anotherBook = App\Book::find(2);
        
        return new CartItem($anotherBook, 1, 0);
    }
}

附加方法getItem期望您返回Damjangkae\Cart\CartItem,其创建方式与您在Cart::add()中执行的方式相同。如果您想免费赠送,请确保将价格设置为0。

最后示例:如果您希望购物车中只有一个条件。

public function allow(Cart $cart): bool
{
    return $cart->conditions->count() == 0;
}

步骤二:将条件添加到购物车。

您必须提供条件键,例如10% 折扣来识别您的条件。

Cart::addCondition('10% off', new TenPercentOffIfSubtotalOver500Baht);

最终:亲眼见证魔法。

Cart::add($book, 1, 1000);
Cart::addCondition('10% off', new TenPercentOffIfSubtotalOver500Baht);

Cart::subtotal(); // 1000
Cart::total(); // 900

存储到数据库

您可能希望将数据存储到数据库中,例如用户喜欢在机器上购物。

存储

\Cart::add($book1);
\Cart::addCondition('10% off', new TenPercentOffIfSubtotalOver500Baht);

\Cart::store('user_1');

恢复

\Cart::restore('user_1');

\Cart::items()->first(); // $book1

注意:恢复数据库中的记录后,将删除

也可以与实例一起工作

\Cart::instance('user_1')->add($book1);
\Cart::instance('user_2')->add($book2);

\Cart::instance('user_1')->store('test_1');
\Cart::instance('user_2')->store('test_2');

异常

事件