nguyenquang2302 / shoppingcart-eloquent
一个简单的基于Laravel的购物车。使用持久的Eloquent数据库而不是会话。
Requires
- guzzlehttp/guzzle: ^6.3.1|^7.0
- illuminate/console: ^5.8|^6|^7|^8
- illuminate/database: ^5.8|^6|^7|^8
- illuminate/support: ^5.8|^6|^7|^8
- maatwebsite/excel: ^3.0
This package is not auto-updated.
Last update: 2024-09-21 04:17:56 UTC
README
一个简单的基于Laravel的购物车。使用持久的Eloquent数据库而不是会话。
注意
如果您有几分钟时间,我请求您阅读一下动机,了解为什么我要创建这个包,以及它与可用的其他Laravel包有什么不同。当然,您也可以直接开始使用!
另外,我知道测试用例一团糟。我打算尽快修复这个问题。
安装
您可以通过 Composer 安装此包。
在终端中运行Composer require命令
composer require gauravojha/shoppingcart-eloquent
接下来,添加包的服务提供程序并别名包。打开 config/app.php 文件,并在
-
providers数组中添加以下行Ndq\Shoppingcart\ShoppingCartProvider::class,
-
在
aliases数组中添加以下行'Cart' => Ndq\Shoppingcart\CartFacade::class,
由于此包使用Eloquent数据库和相关模型,您还需要从应用的根目录运行以下命令
> php artisan vendor:publish --provider="Ndq\Shoppingcart\ShoppingCartProvider"
当然,不用说,运行迁移后使用 php artisan migrate 创建数据库
完成以上步骤后,您就可以开始使用这个购物车了。
使用
下面的所有使用场景都在 示例 部分的末尾使用单个控制器进行解释
下面的方法使用模型 App\ShoppingCartItem,这是作为 vendor:publish 命令的一部分自动提供的。
购物车提供了以下方法供您使用
Cart::addToCart($productid, $price, $quantity)
将指定数量或 $quantity 的通过其唯一 $productid 识别的传入产品添加到购物车。在此实现中,$price 是单个项目的价格,而不是购物车中所有类似项目的总成本。
// get a product to add to the cart // this will fetch from the database a product, which has 'id' equal to $id $product = Product::find($id); // now add 4 such products to the cart Cart::addToCart($product->id, $product->price, 4);
如果用户已经将相同的产品添加到购物车中,则会更新数量,而不是创建新记录。
Cart::content()
将返回购物车的所有内容给用户。一旦您有了内容,您可以从其中检索 'product_id',然后根据id从数据库中检索产品并对其进行操作。
// obtain all the products in the cart $contents = Cart::content(); // obtain the no.of products in the cart $count = Cart::content()->count();
Cart::removeFromCart($productid)
将移除购物车中 id 等于传入 $productid 的产品
// if a product exists in the cart which has a $product->id = 4, then it will be removed from the cart in its entirety Cart::removeFromCart(4);
Cart::emptyCart()
销毁购物车的所有内容。
// remove all the products in the shopping cart Cart::emptyCart();
Cart::updateItemInCart($productid, $quantity)
更新购物车中产品 $quantity 的数量,其中产品->id 等于 $productid。
// change the quantity of products. // Assuming the cart has a product which has a product with id '4', and you want to change its quantity to 1. Cart::updateItemInCart(4, 1);
Cart::totalPrice()
每个应用程序可能都有不同的流程来计算购物车中商品的总成本。在本实现中,在ShoppingCartImpl文件内部,我声明了两个私有变量$taxRate和$deliveryCharges,并设置了默认值。totalPrice方法通过首先添加购物车中所有商品的总成本,然后在此基础上添加税费和运费,来计算客户在结账时需要支付的总价。代码非常简单直接,因此应该不难修改并按照您的需求使用。
$totalPrice = Cart::totalPrice();
这就说完了。由于记录是使用认证用户ID插入的,所以不存在冲突或其他用户能查看您的记录的情况。此外,您可以添加产品,去那个为期一周的假期,因为数据已经持久化,您可以在离开的地方找到产品。
示例
如前所述,这个包(如果您直接使用),对您施加了一些基本的约束/假设。
对于本节
- 假设有一个简单的“products”表,其结构如下
<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateProductsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('products', function (Blueprint $table) { $table->increments('id'); $table->string('product_name')->unique(); $table->decimal('price_per_item')->default(0.00); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('products'); } }
- 假设有一个以下框架的控制器
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Product; use Cart; use Auth; class CartController extends Controller { /** * Create a new controller instance. * * @return void */ public function __construct(Request $request) { $this->middleware('auth'); } ... // Remaining controller code here ... }
现在,如果您有一个用于将产品添加到购物车的route,则示例可以是
public function addToCart(Request $request, Product $product) { // the request must supply the product to be added and other relevant data Cart::addToCart(Auth::user()->id, $product->id, $product->price_per_item, $request->input('quantity')); }
我希望这个例子足以让您开始探索
即将推出的功能
我明白这个包非常基础,可能仅能满足用户的需求。此外,它并不非常健壮或动态(例如,肯定会有用户添加了一些产品到购物车,而在此期间,应用所有者增加了或减少了产品的价格)。因此,我打算承担以下任务:
- 当产品数据库中的产品价格发生变化时,更新购物车中仍在的产品的价格。
- 引入Redis支持
- 修复测试用例
动机
在您继续之前,请注意,这与其他可用的购物车不同。话虽如此,我并不想贬低那些实现。其他都是非常健壮的,有许多选项。
然而,我个人尝试了其中大多数,从未完全满意。在我看来,一些缺点是
- 使用laravel会话。虽然非常强大,对我来说这意味着
- 当会话结束时,购物车中的项目就消失了。我作为客户,为什么要将一些产品添加到购物车中,决定稍后支付,几个小时后回来,却发现我的购物车空空如也!!!
- 一些购物车存在缺陷,导致购物车不安全。如果我以用户A的身份登录,添加了一些项目,然后登出。然后使用相同的浏览器,我以用户B的身份登录。我仍然能看到A添加的项目。
- 大多数购物车要求开发者传递唯一的“行标识符”,或使用购物车的实例。还有一些我目前不想记起的……
因此,我决定设计自己的购物车,它不使用会话。而是使用持久化的数据库来处理购物车。行是通过登录用户的“标识符”和添加产品的“标识符”来识别的。再见,会话!
这个购物车有一些假设。所以,只有在您清楚地理解这个对您作为开发者的限制之后,才尝试使用它。如果您
- 只允许已注册的和已登录的用户购买产品,因为这个包使用
Auth服务提供商来插入用户标识符。 - 您有一个产品表,其中每个产品都有一个唯一的
id,可以通过它来识别。在代码中(参见提供的迁移),我使用了users表和我的自己的products表。请随意使用您认为合适的表。这也是我的使用场景。请随意根据您的偏好和需求更改代码。
我希望您会发现这个包很有用且易于使用。