简体   繁体   English

Laravel购物车对于所有用户都是一样的

[英]Laravel shopping cart is the same for all users

So I try to create a store with laravel but I have a problem with the shopping cart. 因此,我尝试使用laravel创建商店,但购物车存在问题。 If a user adds an item in the shopping cart, it changes for all users. 如果用户在购物车中添加了商品,则所有用户的商品都会更改。 So if I add an item and then logout from user X and login to user Y, they have the same cart. 因此,如果我添加一个项目,然后从用户X注销并登录到用户Y,则它们具有相同的购物车。
I'm somehow new to Laravel and I really don't know what's the problem here. 我对Laravel还是陌生的,我真的不知道这里出了什么问题。 Thanks for help! 感谢帮助!

Cart 大车

<?php

namespace App;

class Cart
{
    public $items = null;
    public $totalQty = 0;
    public $totalPrice = 0;
    public function __construct($oldCart)
    {
        if ($oldCart) {
            $this->items = $oldCart->items;
            $this->totalQty = $oldCart->totalQty;
            $this->totalPrice = $oldCart->totalPrice;
        }
    }
    public function add($item, $id) {
        $storedItem = ['qty' => 0, 'price' => $item->price, 'item' => $item];
        if ($this->items) {
            if (array_key_exists($id, $this->items)) {
                $storedItem = $this->items[$id];
            }
        }
        $storedItem['qty']++;
        $storedItem['price'] = $item->price * $storedItem['qty'];
        $this->items[$id] = $storedItem;
        $this->totalQty++;
        $this->totalPrice += $item->price;
    }
    public function reduceByOne($id) {
        $this->items[$id]['qty']--;
        $this->items[$id]['price'] -= $this->items[$id]['item']['price'];
        $this->totalQty--;
        $this->totalPrice -= $this->items[$id]['item']['price'];
        if ($this->items[$id]['qty'] <= 0) {
            unset($this->items[$id]);
        }
    }
    public function removeItem($id) {
        $this->totalQty -= $this->items[$id]['qty'];
        $this->totalPrice -= $this->items[$id]['price'];
        unset($this->items[$id]);
    }
}

Product Controller 产品总监

<?php

namespace App\Http\Controllers;

use App\Cart;
use App\Product;
use Illuminate\Http\Request;
use Session;
use Illuminate\Support\Facades\DB;

class ProductController extends Controller
{
    public function getIndex()
    {
        $products = Product::all();
        return view('shop.index', ['products' => $products]);
    }

    public function getAddToCart(Request $request, $id){
        $product = Product::find($id);
        $oldCart = Session::has('cart') ? Session::get('cart'): null;
        $cart = new Cart($oldCart);
        $cart->add($product, $product->id);

        $request->session()->put('cart', $cart);
        return redirect()->route('product.index');
    }

    public function getAddQty(Request $request, $id){
        $product = Product::find($id);
        $oldCart = Session::has('cart') ? Session::get('cart'): null;
        $cart = new Cart($oldCart);
        $cart->add($product, $product->id);

        $request->session()->put('cart', $cart);
        return redirect()->route('product.shoppingCart');
    }

    public function getReduceByOne($id) {
        $oldCart = Session::has('cart') ? Session::get('cart') : null;
        $cart = new Cart($oldCart);
        $cart->reduceByOne($id);
        if (count($cart->items) > 0) {
            Session::put('cart', $cart);
        } else {
            Session::forget('cart');
        }
        return redirect()->route('product.shoppingCart');
    }

    public function getRemoveItem($id) {
        $oldCart = Session::has('cart') ? Session::get('cart') : null;
        $cart = new Cart($oldCart);
        $cart->removeItem($id);
            if (count($cart->items) > 0) {
                Session::put('cart', $cart);
            } 
            else {
                Session::forget('cart');
            }
        return redirect()->route('product.shoppingCart');
    }

    public function getCart(){
        if(!Session::has('cart')){
            return view('shop.shopping-cart');
        }
        $oldCart = Session::get('cart');
        $cart = new Cart($oldCart);
        $total = $cart->totalPrice;
        $count = count($cart->items);
        Session::put('cart', $cart);
        return view('shop.shopping-cart', ['products' => $cart->items, 'totalPrice' => $cart->totalPrice, 'total' => $total, 'count' => $count]);
    }

    public function getCheckout()
    {
        if(!Session::has('cart')){
            return view('shop.shopping-cart');
        }
    $oldCart = Session::get('cart');
    $cart = new Cart($oldCart);
    $total = $cart->totalPrice;
    return view('shop.checkout',[ 'total' => $total]);
    }

    public function deleteProduct(Request $request, $id){
        $product = Product::find($id);
        $oldCart = Session::has('cart') ? Session::get('cart'): null;
        $cart = new Cart($oldCart);

        session()->pull('product', $product->id);
        $request->session()->put('cart', $cart);

        return redirect()->route('product.shoppingCart');
    }
}

User Controller 用户控制器

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Request;
use App\Http\Requests;
use Auth;
Use Session;
use App\Cart;

class UserController extends Controller
{
    public function getSignup()
    {
        return view('user.signup');
    }

    public function postSignup(Request $request)
    {
        $this->validate($request, [
            'sex' => 'required',
            'firstname' => 'required',
            'lastname' => 'required',
            'email' => 'email|required|unique:users',
            'password' => 'required|min:4'
        ]);

        $user = new User([
            'sex' => $request->input('sex'),
            'firstname' => $request->input('firstname'),
            'lastname' => $request->input('lastname'),
            'email' => $request->input('email'),
            'password' => bcrypt($request->input('password'))
        ]);
        $user->save();
        Auth::login($user);

        return redirect()->route('user.profile');
    }
    public function getSignin()
    {
        return view('user.login');
    }

    public function postSignin(Request $request){
        $this->validate($request, [
            'email' => 'email|required',
            'password' => 'required|min:4'
        ]);

    if(Auth::attempt([
        'email' => $request->input('email'), 
        'password' => $request->input('password')])){

        return redirect()->route('user.profile');
    }
        return redirect()->back();
    }

    public function getProfile(){
        $user = User::all();

        return view('user.profile',['user' => $user]);
    }

    public function getLogout(){

        Auth::logout();

        return redirect()->route('product.index');
    }
}

In Laravel Session variables persists if you use the same tab to switch user. 在Laravel中,如果使用相同的选项卡切换用户,则会话变量将保留。 So, if you save any session variable belonging to User X, it will still be there, when user Y logs in. Reference 所以,如果你保存属于用户X任何会话变量,它仍然会在那里,当用户Y登录英寸参考

So, you would need to explicitly remove the session for User X when user logs out using Session::forget('key') 因此,当用户使用Session::forget('key')注销时,您需要显式删除User X的会话。

Session::forget('cart');

But, this will create an issue that, whenever user logs out of your application his/her cart will be empty. 但是,这将产生一个问题,每当用户注销您的应用程序时,他/她的购物车将为空。 To tackle this problem, you can would need to associate the cart with user id. 要解决此问题,您可能需要将购物车与用户ID相关联。

One way can be to add user_id to your session variable's key. 一种方法是将user_id添加到会话变量的键中。

While adding the cart to session: 在将购物车添加到会话中时:

$user_id = /*get user_id*/;
Session::put($user_id.'cart', $cart);

While retrieving the cart: 检索购物车时:

$user_id = /*get user_id*/;
Session::get($user_id.'cart', $cart);

Instead of using session to store the cart, I think you should create the table to store the cart and use the foreign key to refer user. 我认为您不应该使用会话来存储购物车,而应该创建表来存储购物车并使用外键引用用户。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM