粗俗/存储

此非官方的Laravel扩展包允许将任何模型添加到可实例化的“购物车”、“报价”或其他“篮子”中。

v1.0.0 2024-02-28 01:09 UTC

This package is auto-updated.

Last update: 2024-09-28 03:06:16 UTC


README

概述

存储是一个非官方的Laravel扩展包,旨在处理Laravel应用程序中篮子和篮子项的管理。它提供了一种灵活且可扩展的解决方案,用于处理购物车、愿望单和其他类似用例。出于粒度目的,此包有意避免了定价和结账功能,专注于篮子内项目的管理。如果您正在寻找基于数量的价目单功能,请关注我即将推出的vulgar/price包。

安装

要将Stow包集成到您的Laravel项目中,请执行

composer require vulgar/stow

然后,发布和迁移数据库表

php artisan vendor:publish --provider="Vulgar\Stow\StowProvider"
php artisan migrate

配置

config/stow.php中定义篮子实例和限制,以确保类型安全和完整性

return [
    'instances' => [
        'cart' => [Product::class, Item::class],
        // Additional instances...
    ],
];

未列出的实例将不受限制,接受任何Stowable模型。

创建篮子

实例化一个篮子,指定一个可选的类型(实例名称)

$cart = new Basket('cart'); // restricted to Product and Item (see stow.php config)
$wishlist = new Basket(); // Unrestricted, any item implementing Stowable interface

向篮子中添加项目

将可存储接口添加到任何模型中,以允许它们被添加到篮子中

class Product implements Stowable
{
    // ...
}

添加遵守实例限制和选项的项目

$product = new Product();
$cart->add($product, 1, ['size' => 'M', 'color' => 'blue']);

$item = new Item(); // Assume this class implements Stowable as well
$cart->add($item, 2);

// Service has not been explicitly allowed in the 'cart' instance (see stow.php config)
$service = new Service();
$cart->add($service); // Throws UnstowableObjectException

$wishlist->add($service); // instances without restrictions can accept any Stowable

如果项目已存在于篮子中,并且具有相同选项,则只有当项目存在时,其数量才会增加。

$basketItem1 = $cart->add($product); // new product added because options don't match, quantity in cart is 1
$basketItem2->add($product, 3, ['size' => 'M', 'color' => 'blue']); // product with same options already in cart, quantity incremented and is now 3

更新篮子项目

更新篮子中的项目详情,这需要BasketItem或其ID

$cart->change($basketItem, 3, ['size' => 'L']); // Update quantity and options

从篮子中删除项目

通过BasketItem或ID从篮子中删除项目

$cart->remove($basketItem);

检索篮子项目

从篮子中检索项目

$basketItems = $cart->basketItems->with('stowable')->get();

// group items by stowable type
$grouped = $basketItems->groupBy('stowable_type');

// filter items by stowable class
$filtered = $basketItems->filter(function($item) {
    return $item->stowable instanceof Product;
});

// iterate over items
foreach($basketItems as $basketItem) {
    $stowable = $basketItem->stowable;
    // ...
}

合并篮子

将一个篮子的内容合并到另一个篮子中

$wishlist->merge($cart);

克隆篮子

克隆一个篮子和其相关项目

$clone = $wishlist->clone();

删除篮子

删除篮子和其相关项目

$cart->delete();

详细事件概述

以下是对事件、它们提供的对象以及如何使用它们的概述

1. BasketCreatedEvent

  • 包含对象: $basket(新创建的篮子实例)
  • 用法:您可以使用此事件在创建新的篮子后执行操作,例如记录、自定义通知或与其他系统集成。

2. BasketUpdatedEvent

  • 包含对象: $basket(更新的篮子实例)
  • 用法:此事件允许您响应篮子的更新,启用诸如审计、触发业务工作流程或更新相关数据之类的操作。

3. BasketDeletedEvent

  • 包含对象: $basket(已删除的篮子实例)
  • 用法:对于清理相关资源或在删除后执行操作非常重要。内置监听器使用此来删除相关篮子项目,但您可以扩展功能以满足其他需求。

4. BasketItemCreatedEvent

  • 包含对象: $basketItem(新添加的篮子项目实例)
  • 用法:用于跟踪篮子中添加的内容非常有用,例如更新库存或基于新的篮子内容触发推荐。

5. BasketItemUpdatedEvent

  • 包含对象: $basketItem(更新的篮子项目实例)
  • 用法:利用此事件处理篮子项的变化,例如调整库存水平、重新计算篮子总计或应用其他业务规则。

6. BasketItemDeletedEvent

  • 包含对象: $basketItem (被移除的购物车项目实例)
  • 用法:此事件可用于与BasketItemUpdatedEvent类似的操作,但具体用于响应项目删除。

创建和注册自定义监听器

要为这些事件中的任何一个创建自定义监听器,请使用Artisan命令生成监听器

php artisan make:listener YourCustomListener --event=BasketUpdatedEvent

在你的自定义监听器中,你可以访问事件对象及其属性

namespace App\Listeners;

use Vulgar\Stow\Events\BasketUpdatedEvent;

class YourCustomListener
{
    public function handle(BasketUpdatedEvent $event)
    {
        $basket = $event->basket; // Access the updated basket
        // Implement your custom logic here
    }
}

EventServiceProvider中注册你的监听器

protected $listen = [
    'Vulgar\Stow\Events\BasketUpdatedEvent' => [
        'App\Listeners\YourCustomListener',
    ],
];

最佳实践和潜在问题

  • 确保正确配置实例以防止意外的项目类型。
  • 利用事件在应用程序中同步购物车状态。
  • 在使用大型购物车时监控性能,并考虑缓存策略。