2017-02-18 4 views
1

Ich arbeite an einer einfachen Logik des Speicherns meines Einkaufswagens in Sitzung mit Yii2 native yii \ web \ Sitzung. Jedes Mal, wenn ich einen Artikel in einen Warenkorb hinzufügen nenne ich eine Methode:Yii2 erstellt neue Sitzung, anstatt bestehende zu öffnen

public function actionAdd() { 

    $id = Yii::$app->request->get('id'); 
    $product = Product::findOne($id); 

    $session = Yii::$app->session; 
    $session->open(); 

    $cart = new Cart(); 
    $cart->addToCart($product); 

    $this->layout = false; 
    return $this->render('cart-modal', compact('session')); 
} 

diese Methode mit einem Warenkorb-Modell funktioniert und fügt meinen Artikel die Sitzung:

public function addToCart($product, $qty = 1) { 

    if(isset($_SESSION['cart'][$product->id])) { 
     $_SESSION['cart'][$product->id]['qty'] += $qty; 
    } else { 
     $_SESSION['cart'][$product->id] = [ 
      'qty' => $qty, 
      'title' => $product->title, 
      'price' => $product->price, 
      'image' => $product->image, 
     ]; 
    } 
} 

und alles gut geht, bis ich versuch einen anderen Gegenstand hinzuzufügen. Dann Yii, anstatt vorhandene Sitzung zu öffnen, erstellt eine neue mit diesem letzten Element, das ich hinzugefügt habe. Was kann der Grund für diese Art von Verhalten sein?

Ich arbeite auf einem lokalen Webserver OpenServer und hat keine Einstellung geändert, die möglicherweise mit Sitzungen zusammenhängen.

+0

Probieren Sie session_status() zu Beginn Ihrer Aktion aus, um den Status Ihrer Sitzung anzuzeigen. –

Antwort

1

Ok, habe ich mir gedacht. Das Problem war mit meinem Server. Sobald ich zu VPS gewechselt bin, ist dieses Problem verschwunden.

2

Sie verwenden grundsätzlich session Komponente überhaupt nicht. Ändern Sie Ihren Code zu:

public function actionAdd() { 

    $id = Yii::$app->request->get('id'); 
    $product = Product::findOne($id); 

    // REMOVE THIS 
    // session is started automatically when using component 
    // $session = Yii::$app->session; 
    // $session->open(); 

    $cart = new Cart(); 
    $cart->addToCart($product); 

    $this->layout = false; 
    return $this->render('cart-modal', compact('session')); 
} 

public function addToCart($product, $qty = 1) { 

    $session = Yii::$app->session; 
    if ($session->has('cart')) { 
     $cart = $session['cart']; // you can not modify session subarray directly 
    } else { 
     $cart = []; 
    } 
    if(isset($cart[$product->id])) { 
     $cart[$product->id]['qty'] += $qty; 
    } else { 
     $cart[$product->id] = [ 
      'qty' => $qty, 
      'title' => $product->title, 
      'price' => $product->price, 
      'image' => $product->image, 
     ]; 
    } 
    $session->set('cart', $cart); 
} 

Ich hoffe, es hilft. Wenn nicht, bedeutet das, dass das Problem woanders liegt, aber trotzdem sollten Sie die session Komponente richtig verwenden.

Verwandte Themen