我使用https://github.com/darryldecode/laravelshoppingcart
我只通过用户名进行身份验证,没有密码
问题在于会话 当我是访客时,会话代码是例如
9ot0CjCYUQpYR10ox43A9GoHVp6vliXuFFsoZlGU
注册后会更新为不同的代码
HXTc6LXNEW79QzvrvnKwi2N3IBQWwSroBfghOznR
在config/auth.php中
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'customers',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => Modules\User\Entities\User::class,
],
'customers' => [
'driver' => 'eloquent',
'model' => Modules\User\Entities\Customer::class,
],
],
CACHE_DRIVER=redis
SESSION_DRIVER=redis
在用户/Http/Controllers/AuthController.php中
public function verify(VerifyCodeRequest $request)
{
$customer = $this->customer($request);
/* code etc. */
if ($customer->exists) {
auth()->login($customer,true);
}
}
在购物车/Providers/CartServiceProvider.php
public function register()
{
$this->app->singleton(Cart::class, function ($app) {
return new Cart(
$app['session'],
$app['events'],
'cart',
session()->getId(),
config('fleetcart.modules.cart.config')
);
});
}
对我有用的(原始代码由@liamjcooper)是创建事件侦听器。
namespace App\Providers;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
/* flash cart items */
\Illuminate\Auth\Events\Attempting::class => [
\App\Listeners\PrepareCartTransfer::class
],
/* add flashed cart items to authenticated user cart */
\Illuminate\Auth\Events\Login::class => [
\App\Listeners\TransferGuestCartToUser::class
]
/* end cart item */
];
然后就跑了
php artisan event:generate
听众
闪现客人的购物车内容
namespace App\Listeners;
class PrepareCartTransfer
public function handle(Attempting $event)
{
if (Auth::guest()) {
session()->flash('guest_cart', [
'session' => session()->getId(),
'data' => \Cart::getContent()
]);
}
}
将购物车商品转移给经过身份验证的用户
namespace App\Listeners;
class TransferGuestCartToUser
{
public function handle(Login $event)
{
$userCart = \Cart::getContent();
$userCartItems = $userCart->toArray();
if (session('guest_cart.data') != null ) {
$guestCart = session('guest_cart.data');
$guestCartItems = $guestCart->toArray();
}
if ($userCart->isNotEmpty() && !empty($guestCartItems)) {
$maxUserCartId = max(array_column($userCartItems, 'id'));
$guestCartItems = array_map(function ($item) use (&$maxUserCartId) {
return array_merge($item, ['id' => ++$maxUserCartId]);
}, $guestCartItems);
}
这对我运行库存包来说已经足够了。