diff --git a/config/cart.php b/config/cart.php index da86159..d8ee7c3 100644 --- a/config/cart.php +++ b/config/cart.php @@ -11,6 +11,37 @@ return [ | Taxable interface and use the HasTax trait. | */ - 'tax' => 21 + + 'tax' => 21, + + /* + |-------------------------------------------------------------------------- + | Shoppingcart database settings + |-------------------------------------------------------------------------- + | + | Here you can set the connection that the shoppingcart should use when + | storing and restoring a cart. + | + */ + + 'database' => [ + + 'connection' => null, + + 'table' => 'shoppingcart', + + ], + + /* + |-------------------------------------------------------------------------- + | Destroy the cart on user logout + |-------------------------------------------------------------------------- + | + | When this option is set to 'true' the cart will automatically + | destroy all cart instances when the user logs out. + | + */ + + 'destroy_on_logout' => false, ]; \ No newline at end of file diff --git a/src/Cart.php b/src/Cart.php index 2c0ae40..e87a129 100644 --- a/src/Cart.php +++ b/src/Cart.php @@ -493,7 +493,9 @@ class Cart */ private function getConnection() { - return app(DatabaseManager::class)->connection(config('cart.database.connection', config('database.default'))); + $connectionName = $this->getConnectionName(); + + return app(DatabaseManager::class)->connection($connectionName); } /** @@ -505,4 +507,16 @@ class Cart { return config('cart.database.table', 'shoppingcart'); } + + /** + * Get the database connection name. + * + * @return string + */ + private function getConnectionName() + { + $connection = config('cart.database.connection'); + + return is_null($connection) ? config('database.default') : $connection; + } } diff --git a/src/ShoppingcartServiceProvider.php b/src/ShoppingcartServiceProvider.php index a0bc8a7..979f579 100644 --- a/src/ShoppingcartServiceProvider.php +++ b/src/ShoppingcartServiceProvider.php @@ -2,6 +2,8 @@ namespace Gloudemans\Shoppingcart; +use Illuminate\Auth\Events\Logout; +use Illuminate\Session\SessionManager; use Illuminate\Support\ServiceProvider; class ShoppingcartServiceProvider extends ServiceProvider @@ -19,6 +21,14 @@ class ShoppingcartServiceProvider extends ServiceProvider $config = __DIR__ . '/../config/cart.php'; $this->mergeConfigFrom($config, 'cart'); + $this->publishes([__DIR__ . '/../config/cart.php' => config_path('cart.php')], 'config'); + + $this->app['events']->listen(Logout::class, function () { + if ($this->app['config']->get('cart.destroy_on_logout')) { + $this->app->make(SessionManager::class)->forget('cart'); + } + }); + if ( ! class_exists('CreateShoppingcartTable')) { // Publish the migration $timestamp = date('Y_m_d_His', time()); diff --git a/tests/CartTest.php b/tests/CartTest.php index fca6a86..b7df8d2 100644 --- a/tests/CartTest.php +++ b/tests/CartTest.php @@ -614,7 +614,7 @@ class CartTest extends Orchestra\Testbench\TestCase $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); - $this->assertEquals('Mockery_0_Gloudemans_Shoppingcart_Contracts_Buyable', PHPUnit_Framework_Assert::readAttribute($cartItem, 'associatedModel')); + $this->assertContains('Gloudemans_Shoppingcart_Contracts_Buyable', PHPUnit_Framework_Assert::readAttribute($cartItem, 'associatedModel')); } /** @test */ @@ -909,6 +909,22 @@ class CartTest extends Orchestra\Testbench\TestCase $this->assertEquals(3.80, $cart->tax(2)); } + /** @test */ + public function it_will_destroy_the_cart_when_the_user_logs_out_and_the_config_setting_was_set_to_true() + { + $this->app['config']->set('cart.destroy_on_logout', true); + + $session = Mockery::mock(\Illuminate\Session\SessionManager::class); + + $session->shouldReceive('forget')->once()->with('cart'); + + $this->app->instance(\Illuminate\Session\SessionManager::class, $session); + + $user = Mockery::mock(\Illuminate\Contracts\Auth\Authenticatable::class); + + event(new \Illuminate\Auth\Events\Logout($user)); + } + /** * Get an instance of the cart. *