Yii2创建新会话而不是打开现有会话

时间:2017-02-18 09:56:50

标签: php session yii yii2

我正在研究使用Yii2原生 yii \ web \ Session 将我的购物车存储在会话中的简单逻辑。 每次我将商品添加到购物车时,我都会调用一种方法:

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

此方法适用于Cart模型并将我的项目添加到会话中:

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而不是打开现有会话创建一个新的,我添加的最后一项。这种行为可能是什么原因?

我正在使用本地Web服务器OpenServer,并且没有更改任何可能与会话相关的设置。

2 个答案:

答案 0 :(得分: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组件。

答案 1 :(得分:1)

好的,我想。问题出在我的服务器上。一旦我搬到VPS,这个问题就消失了。