将购物车从访客转移到用户登录?

问题描述 投票:0回答:1

我使用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')
            );
        }); 
}
php laravel cart
1个回答
0
投票

对我有用的(原始代码由@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);
        }   

这对我运行库存包来说已经足够了。

© www.soinside.com 2019 - 2024. All rights reserved.