我正在研究使用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,并且没有更改任何可能与会话相关的设置。
答案 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,这个问题就消失了。