2017-08-25 70 views
0

所以我尝试创建laravel商店相同的,但我有一个购物车的问题。如果用户在购物车中添加商品,则所有用户都会更改。所以,如果我想补充一个项目,然后注销用户从X和登录用户Y,它们具有相同的车。
我莫名其妙新Laravel,我真不知道这里有什么问题。感谢帮助!Laravel购物车是为所有用户

<?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]); 
    } 
} 

产品控制器

<?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'); 
    } 
} 

用户控制器

<?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'); 
    } 
} 
+0

你存储在会话中的车对象。无论您是否使用其他用户登录或注销,购物车都将始终存在该会话。您不是将购物车与用户关联,而是与会话关联。尝试打开隐身窗口,看看你是否得到相同的购物车,我几乎可以保证你不会。 –

+0

是的,我不知道。但对于使用同一浏览器的2位用户使用相同的购物车仍然是个问题。 – Hades2x

回答

0

在Laravel的Ses如果您使用相同的选项卡切换用户,则sion变量仍然存在。 所以,如果你保存属于用户X任何会话变量,它仍然会在那里,当用户Y登录英寸Reference

那么,你就需要在用户注销时使用Session::forget('key')明确移除用户X会话

Session::forget('cart'); 

但是,这将创建一个问题是,每当用户退出应用程序的他/她的购物车是空的。要解决此问题,您可能需要将购物车与用户标识相关联。

一种方式可以是USER_ID添加到您的会话变量的关键。

同时加入购物车会话:

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

在检索购物车:

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

而不是使用会话存储车的,我想你应该创建一个用于存储车表并使用外键来引用用户。

+0

嘿,谢谢你的回答。这不起作用,在做出更改后,这些项目不会再添加到图表中。 – Hades2x

+0

@ Hades2x可以请你打电话给我使用什么方法以及你在发布的代码中发布了什么变化 – jaysingkar

+0

我做了$ userid = Auth :: user-> id和$ request-> session() - > put( $ userid。'cart',$ cart),正如你所建议的那样。 – Hades2x