2017-02-18 16 views
1

Я работаю над простой логикой хранения моей корзины покупок в сеансе с использованием родного Yii2 yii \ web \ Session. Каждый раз, когда я добавить элемент в корзину я вызываю метод:Yii2 создает новую сессию вместо открытия существующих

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

этот метод работает с тележкой модели и добавляет мой деталь к сессии:

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, 
     ]; 
    } 
} 

и все идет хорошо, пока я попробуйте добавить другой элемент. Затем Yii вместо открытия существующего сеанса создает новый с этим последним элементом, который я добавляю. Что может быть причиной такого поведения?

Я работаю на локальном веб-сервере OpenServer и не изменял никаких параметров, которые могут быть связаны с сеансами.

+0

Попробуйте session_status() в начале действия, чтобы увидеть статус вашей сессии. –

ответ

1

Хорошо, я понял. Проблема была в моем сервере. Как только я переехал в VPS, этот вопрос пропал.

2

Вы в основном не используете компонент session. Измените свой код на:

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

Надеюсь, это поможет. Если это не означает, что проблема находится где-то в другом месте, но, тем не менее, вы должны правильно использовать компонент session.