2017-08-25 1 views
0

laravelを使用して店舗を作成しようとしましたが、ショッピングカートに問題があります。ユーザーがショッピングカートにアイテムを追加すると、そのアイテムはすべてのユーザーに変更されます。したがって、アイテムを追加してからユーザーXからログアウトしてユーザーYにログインすると、同じカートが使用されます。
私は何らかの形でLaravelを新しくしています。本当にここで何が問題なのか分かりません。手伝ってくれてありがとう! LaravelのSesで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

あなたが同じタブを使用してユーザーを切り替えると、シオン変数が維持されます。 あなたはユーザーXに属するすべてのセッション変数を保存した場合、ユーザYがログインするので、それはまだ、そこになります。Reference

ユーザーがSession::forget('key')を使用してログアウトするときには、明示的にユーザーXのセッションを削除する必要があります

Session::forget('cart'); 

しかし、これにより、ユーザーがアプリケーションからログアウトするたびに、カートが空になるという問題が発生します。この問題に取り組むには、カートをユーザーIDに関連付ける必要があります。

セッション変数のキーに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() $ userid .'cart '、$ cart)を入力してください。 – Hades2x

関連する問題