2017-08-25 67 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