From 95a74b647045e6255ea08f7f8fc3d4dd397dc94f Mon Sep 17 00:00:00 2001 From: tomhatzer Date: Thu, 31 Oct 2019 12:55:13 +0100 Subject: [PATCH 1/5] Make Cart model customizable and easy to exchange --- README.md | 55 +++++++++++++++---- config/cart_manager.php | 3 + src/CartManagerServiceProvider.php | 7 ++- src/Console/Commands/ClearCartDataCommand.php | 3 +- src/Contracts/Cart.php | 11 ++++ src/Drivers/DatabaseDriver.php | 14 ++--- src/Drivers/SessionDriver.php | 1 + src/Models/Cart.php | 3 +- src/Observers/CartObserver.php | 6 +- tests/CartEventsTest.php | 3 + tests/ClearCartDataCommandTest.php | 3 +- 11 files changed, 82 insertions(+), 27 deletions(-) create mode 100644 src/Contracts/Cart.php diff --git a/README.md b/README.md index 0b17a53..fe9ecf3 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,7 @@ Laravel 5.5+ ## Table of contents * [Configuration Options](#configuration-options) +* [Custom Cart model](#custom-cart-model) * [Drivers](#drivers) * Using the Package * [Cart Management](#cart-management) @@ -103,38 +104,72 @@ Laravel 5.5+ `cart_manager.php` file contains the following config options for the package: -1. **driver :** *(default: DatabaseDriver)* +1. **cart_model :** *(default: Cart)* +The [cart model](#custom-cart-model) that should be used. You can use existing ones or create your own. + +2. **driver :** *(default: DatabaseDriver)* The [driver](#drivers) that should be used to store and retrieve cart details. You can use existing ones or create your own. -2. **auth_guard :** *(default: web)* +3. **auth_guard :** *(default: web)* The authentication guard that should be used to identify the logged in customer. This package can store carts for guest users as well as logged in users. -3. **shipping_charges :** *(default: 10)* +4. **shipping_charges :** *(default: 10)* The amount that should be applied as shipping of the order. -4. **shipping_charges_threshold :** *(default: 100)* +5. **shipping_charges_threshold :** *(default: 100)* The minimum order amount to avoid the shipping charges. Take a note that order amount is calculated as subtotal of the cart items - discount amount. -5. **tax_percentage :** *(default: 6%)* +6. **tax_percentage :** *(default: 6%)* Tax is applied on subtotal of the cart items - discount amount + shipping charges and rounded to 2 decimals. -6. **round_off_to :** *(default: 0.05)* +7. **round_off_to :** *(default: 0.05)* You may wish to round of the order amount to the nearest decimal point. Options are (0 or 0.05 or 0.1 or 0.5 or 1) -7. **cookie_name :** *(default: cart_identifier)* +8. **cookie_name :** *(default: cart_identifier)* The name of the cookie that this package stores to identify the guests of the web app and store their cart data. -8. **cookie_lifetime :** *(default: 1 week)* +9. **cookie_lifetime :** *(default: 1 week)* Number of minutes for which the cart cookie should be valid in customer's browser. -9. **LC_MONETARY :** *(default: en_US.UTF-8)* +10. **LC_MONETARY :** *(default: en_US.UTF-8)* This option is used to display the various totals of the cart with a currency symbol. We use php's native [money_format()](//php.net/manual/en/function.money-format.php) function to display currency with amount. -10. **cart_data_validity :** *(default: 1 week) (Database driver only)* +11. **cart_data_validity :** *(default: 1 week) (Database driver only)* You may wish to remove old/invalid cart data from the database. You can specify the validity period and run/schedule the [ClearCartDataCommand](#commands) for the same. **[⬆ back to top](#table-of-contents)** +## Custom Cart model + +You can use your own custom cart model that extends the default Cart model. + +Example: + +```php +namespace App; + +use Freshbitsweb\LaravelCartManager\Models\Cart; + +class CustomCart extends Cart +{ + // Set table to carts table + protected $table = 'carts'; + + // User relation + public function user() + { + return $this->belongsTo(User::class, 'auth_user', 'id'); + } + + // Coupon relation (Coupon class is not included in this package) + public function coupon() + { + return $this->belongsTo(Coupon::class, 'coupon_id', 'id'); + } +} + +``` + ## Drivers You can set the driver that should be used to store and retrieve cart details in the `cart_manager.php` config file. You can use existing ones or create your own driver. diff --git a/config/cart_manager.php b/config/cart_manager.php index 53f2237..655d074 100644 --- a/config/cart_manager.php +++ b/config/cart_manager.php @@ -1,6 +1,9 @@ Freshbitsweb\LaravelCartManager\Models\Cart::class, + // The driver that should be used to manage the cart (database/session/custom) 'driver' => Freshbitsweb\LaravelCartManager\Drivers\DatabaseDriver::class, diff --git a/src/CartManagerServiceProvider.php b/src/CartManagerServiceProvider.php index 42363ca..87988a6 100644 --- a/src/CartManagerServiceProvider.php +++ b/src/CartManagerServiceProvider.php @@ -6,7 +6,7 @@ use Freshbitsweb\LaravelCartManager\Core\Cart; use Freshbitsweb\LaravelCartManager\Contracts\CartDriver; use Freshbitsweb\LaravelCartManager\Observers\CartObserver; -use Freshbitsweb\LaravelCartManager\Models\Cart as CartModel; +use Freshbitsweb\LaravelCartManager\Contracts\Cart as CartContract; use Freshbitsweb\LaravelCartManager\Console\Commands\ClearCartDataCommand; class CartManagerServiceProvider extends ServiceProvider @@ -30,7 +30,7 @@ public function boot() $this->commands([ClearCartDataCommand::class]); } - CartModel::observe(CartObserver::class); + resolve(config('cart_manager.cart_model'))::observe(CartObserver::class); } /** @@ -48,6 +48,9 @@ public function register() // Bind the driver with contract $this->app->bind(CartDriver::class, $this->app['config']['cart_manager']['driver']); + // Bind the custom cart model with contract + $this->app->bind(CartContract::class, $this->app['config']['cart_manager']['cart_model']); + // Bind the cart class $this->app->bind(Cart::class, function ($app) { return new Cart($app->make(CartDriver::class)); diff --git a/src/Console/Commands/ClearCartDataCommand.php b/src/Console/Commands/ClearCartDataCommand.php index b5dd4bb..afa50bd 100644 --- a/src/Console/Commands/ClearCartDataCommand.php +++ b/src/Console/Commands/ClearCartDataCommand.php @@ -5,7 +5,6 @@ use Carbon\Carbon; use Illuminate\Console\Command; use Illuminate\Support\Facades\Schema; -use Freshbitsweb\LaravelCartManager\Models\Cart; use Freshbitsweb\LaravelCartManager\Models\CartItem; class ClearCartDataCommand extends Command @@ -40,7 +39,7 @@ public function handle() $validHours = config('cart_manager.cart_data_validity'); - $query = Cart::where('updated_at', '<', Carbon::now()->subHours($validHours)); + $query = resolve(config('cart_manager.cart_model'))::where('updated_at', '<', Carbon::now()->subHours($validHours)); $cartIds = $query->get(['id']); diff --git a/src/Contracts/Cart.php b/src/Contracts/Cart.php new file mode 100644 index 0000000..90cae01 --- /dev/null +++ b/src/Contracts/Cart.php @@ -0,0 +1,11 @@ +cartItemsQuery()) + $cartData = resolve(config('cart_manager.cart_model'))::with($this->cartItemsQuery()) ->where($this->cartIdentifier()) ->first($selectColumns) ; // If there is no cart record for the logged in customer, try with cookie identifier if (! $cartData && Auth::guard(config('cart_manager.auth_guard'))->check()) { - $cartData = Cart::with($this->cartItemsQuery()) + $cartData = resolve(config('cart_manager.cart_model'))::with($this->cartItemsQuery()) ->where($this->getCookieElement()) ->first($selectColumns) ; @@ -68,7 +68,7 @@ protected function cartItemsQuery() protected function assignCustomerToCartRecord() { // Assign the logged in customer to the cart record - Cart::where($this->getCookieElement())->update([ + resolve(config('cart_manager.cart_model'))::where($this->getCookieElement())->update([ 'auth_user' => Auth::guard(config('cart_manager.auth_guard'))->id(), ]); } @@ -101,7 +101,7 @@ public function updateCart($cartId, $cartData) { $cartData = $this->arraySnakeCase($cartData); - Cart::where('id', $cartId)->update($cartData); + resolve(config('cart_manager.cart_model'))::where('id', $cartId)->update($cartData); } /** @@ -140,7 +140,7 @@ protected function storeCartDetails($cartData) { $cartData = $this->arraySnakeCase($cartData); - $cart = Cart::updateOrCreate( + $cart = resolve(config('cart_manager.cart_model'))::updateOrCreate( $this->cartIdentifier(), array_merge($cartData, $this->getCookieElement()) ); @@ -209,7 +209,7 @@ public function setCartItemQuantity($cartItemId, $newQuantity) */ public function clearData() { - $cart = Cart::where($this->cartIdentifier())->first(); + $cart = resolve(config('cart_manager.cart_model'))::where($this->cartIdentifier())->first(); if ($cart) { $cart->delete(); diff --git a/src/Drivers/SessionDriver.php b/src/Drivers/SessionDriver.php index c0af632..1335737 100644 --- a/src/Drivers/SessionDriver.php +++ b/src/Drivers/SessionDriver.php @@ -2,6 +2,7 @@ namespace Freshbitsweb\LaravelCartManager\Drivers; +use Freshbitsweb\LaravelCartManager\Contracts\Cart; use Freshbitsweb\LaravelCartManager\Contracts\CartDriver; class SessionDriver implements CartDriver diff --git a/src/Models/Cart.php b/src/Models/Cart.php index 9311006..3396888 100644 --- a/src/Models/Cart.php +++ b/src/Models/Cart.php @@ -3,8 +3,9 @@ namespace Freshbitsweb\LaravelCartManager\Models; use Illuminate\Database\Eloquent\Model; +use Freshbitsweb\LaravelCartManager\Contracts\Cart as CartContract; -class Cart extends Model +class Cart extends Model implements CartContract { /** * The attributes that are mass assignable. diff --git a/src/Observers/CartObserver.php b/src/Observers/CartObserver.php index 4ef03fd..300f238 100644 --- a/src/Observers/CartObserver.php +++ b/src/Observers/CartObserver.php @@ -2,17 +2,17 @@ namespace Freshbitsweb\LaravelCartManager\Observers; -use Freshbitsweb\LaravelCartManager\Models\Cart; +use Freshbitsweb\LaravelCartManager\Contracts\Cart as CartContract; class CartObserver { /** * Listen to the Cart deleting event. * - * @param \Freshbitsweb\LaravelCartManager\Models\Cart $cart + * @param \Freshbitsweb\LaravelCartManager\Contracts\Cart $cart * @return void */ - public function deleting(Cart $cart) + public function deleting(CartContract $cart) { $cart->items()->delete(); } diff --git a/tests/CartEventsTest.php b/tests/CartEventsTest.php index 4e92a33..74f79b7 100644 --- a/tests/CartEventsTest.php +++ b/tests/CartEventsTest.php @@ -2,6 +2,7 @@ namespace Freshbitsweb\LaravelCartManager\Test; +use Freshbitsweb\LaravelCartManager\Observers\CartObserver; use Illuminate\Support\Facades\Event; use Freshbitsweb\LaravelCartManager\Events\CartCleared; use Freshbitsweb\LaravelCartManager\Events\CartCreated; @@ -9,6 +10,8 @@ use Freshbitsweb\LaravelCartManager\Events\CartItemRemoved; use Freshbitsweb\LaravelCartManager\Events\DiscountApplied; use Freshbitsweb\LaravelCartManager\Test\Support\TestProduct; +use function config; +use function resolve; class CartEventsTest extends TestCase { diff --git a/tests/ClearCartDataCommandTest.php b/tests/ClearCartDataCommandTest.php index 8a76f51..6a970d6 100644 --- a/tests/ClearCartDataCommandTest.php +++ b/tests/ClearCartDataCommandTest.php @@ -3,7 +3,6 @@ namespace Freshbitsweb\LaravelCartManager\Test; use Carbon\Carbon; -use Freshbitsweb\LaravelCartManager\Models\Cart; class ClearCartDataCommandTest extends TestCase { @@ -26,7 +25,7 @@ public function clear_cart_command_removes_invalid_data() $validHours = config('cart_manager.cart_data_validity') + 1; - Cart::where('id', 1)->update(['updated_at' => Carbon::now()->subHours($validHours)]); + resolve(config('cart_manager.cart_model'))::where('id', 1)->update(['updated_at' => Carbon::now()->subHours($validHours)]); $this->artisan('lcm_carts:clear_old'); From d7be07aa4bd6be8644897a83a3629007a55edb3a Mon Sep 17 00:00:00 2001 From: tomhatzer Date: Thu, 31 Oct 2019 13:00:15 +0100 Subject: [PATCH 2/5] Fix failing tests --- src/Contracts/Cart.php | 3 ++- tests/CartEventsTest.php | 3 --- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Contracts/Cart.php b/src/Contracts/Cart.php index 90cae01..fc794d0 100644 --- a/src/Contracts/Cart.php +++ b/src/Contracts/Cart.php @@ -8,4 +8,5 @@ interface Cart * Get the items of the cart. */ public function items(); -} \ No newline at end of file +} + diff --git a/tests/CartEventsTest.php b/tests/CartEventsTest.php index 74f79b7..4e92a33 100644 --- a/tests/CartEventsTest.php +++ b/tests/CartEventsTest.php @@ -2,7 +2,6 @@ namespace Freshbitsweb\LaravelCartManager\Test; -use Freshbitsweb\LaravelCartManager\Observers\CartObserver; use Illuminate\Support\Facades\Event; use Freshbitsweb\LaravelCartManager\Events\CartCleared; use Freshbitsweb\LaravelCartManager\Events\CartCreated; @@ -10,8 +9,6 @@ use Freshbitsweb\LaravelCartManager\Events\CartItemRemoved; use Freshbitsweb\LaravelCartManager\Events\DiscountApplied; use Freshbitsweb\LaravelCartManager\Test\Support\TestProduct; -use function config; -use function resolve; class CartEventsTest extends TestCase { From 44c0b5e625a4d7e83fa73b7a50144c8e6c8a8246 Mon Sep 17 00:00:00 2001 From: tomhatzer Date: Thu, 31 Oct 2019 13:01:25 +0100 Subject: [PATCH 3/5] Fix failing tests --- .idea/.gitignore | 2 ++ .idea/inspectionProfiles/Project_Default.xml | 5 +++++ .idea/manager2.iml | 11 +++++++++++ .idea/misc.xml | 6 ++++++ .idea/modules.xml | 8 ++++++++ .idea/php.xml | 4 ++++ .idea/vcs.xml | 6 ++++++ src/Contracts/Cart.php | 1 - 8 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/manager2.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/php.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5c98b42 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..8d66637 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/manager2.iml b/.idea/manager2.iml new file mode 100644 index 0000000..284a237 --- /dev/null +++ b/.idea/manager2.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..28a804d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..1c6d723 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 0000000..30b4799 --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Contracts/Cart.php b/src/Contracts/Cart.php index fc794d0..bf4fb9c 100644 --- a/src/Contracts/Cart.php +++ b/src/Contracts/Cart.php @@ -9,4 +9,3 @@ interface Cart */ public function items(); } - From a399002092fca6781bc31d208370f758f1da3f53 Mon Sep 17 00:00:00 2001 From: tomhatzer Date: Thu, 31 Oct 2019 13:06:23 +0100 Subject: [PATCH 4/5] Remove .idea files --- .idea/.gitignore | 2 -- .idea/inspectionProfiles/Project_Default.xml | 5 ----- .idea/manager2.iml | 11 ----------- .idea/misc.xml | 6 ------ .idea/modules.xml | 8 -------- .idea/php.xml | 4 ---- .idea/vcs.xml | 6 ------ 7 files changed, 42 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/manager2.iml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/php.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 5c98b42..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Default ignored files -/workspace.xml \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 8d66637..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/manager2.iml b/.idea/manager2.iml deleted file mode 100644 index 284a237..0000000 --- a/.idea/manager2.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 28a804d..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 1c6d723..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml deleted file mode 100644 index 30b4799..0000000 --- a/.idea/php.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From ddcdd1fd4a18b89d45f1b6b40cc588a8f20a2cfc Mon Sep 17 00:00:00 2001 From: tomhatzer Date: Thu, 31 Oct 2019 14:43:10 +0100 Subject: [PATCH 5/5] Add CartItem model customization --- README.md | 50 +++++++++++++------ config/cart_manager.php | 3 ++ src/Console/Commands/ClearCartDataCommand.php | 3 +- src/Contracts/CartItem.php | 11 ++++ src/Drivers/DatabaseDriver.php | 9 ++-- src/Models/Cart.php | 2 +- src/Models/CartItem.php | 5 ++ 7 files changed, 60 insertions(+), 23 deletions(-) create mode 100644 src/Contracts/CartItem.php diff --git a/README.md b/README.md index fe9ecf3..35b1cf4 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ Laravel 5.5+ ## Table of contents * [Configuration Options](#configuration-options) -* [Custom Cart model](#custom-cart-model) +* [Custom models](#custom-models) * [Drivers](#drivers) * Using the Package * [Cart Management](#cart-management) @@ -105,45 +105,48 @@ Laravel 5.5+ `cart_manager.php` file contains the following config options for the package: 1. **cart_model :** *(default: Cart)* -The [cart model](#custom-cart-model) that should be used. You can use existing ones or create your own. +The [cart model](#custom-models) that should be used. You can use the existing model or create your own. -2. **driver :** *(default: DatabaseDriver)* +2. **cart_item_model :** *(default: CartItem)* +The [cart item model](#custom-models) that should be used. You can use the existing model or create your own. + +3. **driver :** *(default: DatabaseDriver)* The [driver](#drivers) that should be used to store and retrieve cart details. You can use existing ones or create your own. -3. **auth_guard :** *(default: web)* +4. **auth_guard :** *(default: web)* The authentication guard that should be used to identify the logged in customer. This package can store carts for guest users as well as logged in users. -4. **shipping_charges :** *(default: 10)* +5. **shipping_charges :** *(default: 10)* The amount that should be applied as shipping of the order. -5. **shipping_charges_threshold :** *(default: 100)* +6. **shipping_charges_threshold :** *(default: 100)* The minimum order amount to avoid the shipping charges. Take a note that order amount is calculated as subtotal of the cart items - discount amount. -6. **tax_percentage :** *(default: 6%)* +7. **tax_percentage :** *(default: 6%)* Tax is applied on subtotal of the cart items - discount amount + shipping charges and rounded to 2 decimals. -7. **round_off_to :** *(default: 0.05)* +8. **round_off_to :** *(default: 0.05)* You may wish to round of the order amount to the nearest decimal point. Options are (0 or 0.05 or 0.1 or 0.5 or 1) -8. **cookie_name :** *(default: cart_identifier)* +9. **cookie_name :** *(default: cart_identifier)* The name of the cookie that this package stores to identify the guests of the web app and store their cart data. -9. **cookie_lifetime :** *(default: 1 week)* +10. **cookie_lifetime :** *(default: 1 week)* Number of minutes for which the cart cookie should be valid in customer's browser. -10. **LC_MONETARY :** *(default: en_US.UTF-8)* +11. **LC_MONETARY :** *(default: en_US.UTF-8)* This option is used to display the various totals of the cart with a currency symbol. We use php's native [money_format()](//php.net/manual/en/function.money-format.php) function to display currency with amount. -11. **cart_data_validity :** *(default: 1 week) (Database driver only)* +12. **cart_data_validity :** *(default: 1 week) (Database driver only)* You may wish to remove old/invalid cart data from the database. You can specify the validity period and run/schedule the [ClearCartDataCommand](#commands) for the same. **[⬆ back to top](#table-of-contents)** -## Custom Cart model +## Custom models -You can use your own custom cart model that extends the default Cart model. +You can use your own custom Cart and CartItem model that extends the default. -Example: +Example for custom Cart model: ```php namespace App; @@ -167,7 +170,24 @@ class CustomCart extends Cart return $this->belongsTo(Coupon::class, 'coupon_id', 'id'); } } +``` + +Example for custom CartItem model: + +```php +namespace App; +use Freshbitsweb\LaravelCartManager\Models\CartItem; + +class CustomCartItem extends CartItem +{ + protected $table = 'cart_items'; + + public function cart() + { + return $this->belongsTo(CustomCart::class, 'cart_id', 'id'); + } +} ``` ## Drivers diff --git a/config/cart_manager.php b/config/cart_manager.php index 655d074..2ff7ec6 100644 --- a/config/cart_manager.php +++ b/config/cart_manager.php @@ -4,6 +4,9 @@ // Custom cart class 'cart_model' => Freshbitsweb\LaravelCartManager\Models\Cart::class, + // Custom cart item class + 'cart_item_model' => Freshbitsweb\LaravelCartManager\Models\CartItem::class, + // The driver that should be used to manage the cart (database/session/custom) 'driver' => Freshbitsweb\LaravelCartManager\Drivers\DatabaseDriver::class, diff --git a/src/Console/Commands/ClearCartDataCommand.php b/src/Console/Commands/ClearCartDataCommand.php index afa50bd..7c3b62e 100644 --- a/src/Console/Commands/ClearCartDataCommand.php +++ b/src/Console/Commands/ClearCartDataCommand.php @@ -5,7 +5,6 @@ use Carbon\Carbon; use Illuminate\Console\Command; use Illuminate\Support\Facades\Schema; -use Freshbitsweb\LaravelCartManager\Models\CartItem; class ClearCartDataCommand extends Command { @@ -46,7 +45,7 @@ public function handle() if ($cartIds->isNotEmpty()) { $cartsDeleted = $query->delete(); - CartItem::whereIn('cart_id', $cartIds->pluck('id')->toArray())->delete(); + resolve(config('cart_manager.cart_item_model'))::whereIn('cart_id', $cartIds->pluck('id')->toArray())->delete(); $this->info("$cartsDeleted older cart record(s) removed from the table."); } else { diff --git a/src/Contracts/CartItem.php b/src/Contracts/CartItem.php new file mode 100644 index 0000000..3c52fe9 --- /dev/null +++ b/src/Contracts/CartItem.php @@ -0,0 +1,11 @@ +arraySnakeCase($cartItem); $cartItem['cart_id'] = $cartId; - CartItem::create($cartItem); + resolve(config('cart_manager.cart_item_model'))::create($cartItem); } /** @@ -127,7 +126,7 @@ public function addCartItem($cartId, $cartItem) */ public function removeCartItem($cartItemId) { - CartItem::destroy($cartItemId); + resolve(config('cart_manager.cart_item_model'))::destroy($cartItemId); } /** @@ -199,7 +198,7 @@ protected function getCookieElement() */ public function setCartItemQuantity($cartItemId, $newQuantity) { - CartItem::where('id', $cartItemId)->update(['quantity' => $newQuantity]); + resolve(config('cart_manager.cart_item_model'))::where('id', $cartItemId)->update(['quantity' => $newQuantity]); } /** @@ -242,7 +241,7 @@ private function arraySnakeCase($array) public function updateItemsData($items) { $items->each(function ($item) { - CartItem::where('id', $item->id)->update([ + resolve(config('cart_manager.cart_item_model'))::where('id', $item->id)->update([ 'name' => $item->name, 'price' => $item->price, 'image' => $item->image, diff --git a/src/Models/Cart.php b/src/Models/Cart.php index 3396888..10edf4a 100644 --- a/src/Models/Cart.php +++ b/src/Models/Cart.php @@ -22,6 +22,6 @@ class Cart extends Model implements CartContract */ public function items() { - return $this->hasMany(CartItem::class); + return $this->hasMany(config('cart_manager.cart_item_model')); } } diff --git a/src/Models/CartItem.php b/src/Models/CartItem.php index 6c5def4..763fe9f 100644 --- a/src/Models/CartItem.php +++ b/src/Models/CartItem.php @@ -32,4 +32,9 @@ public function toArray() 'quantity' => $this->quantity, ]; } + + public function cart() + { + return $this->belongsTo(); + } }