/ / Yii2 створює новий сеанс замість відкриття існуючого - php, session, yii, yii2

Yii2 створює новий сеанс замість відкриття існуючого - php, session, yii, yii2

Я працюю над простою логікою зберігання моєї корзини покупок за допомогою Yii2 native yiiwebSession. Щоразу, коли я додаю товар до кошика, я називаю метод:

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 і не зміг змінити будь-які параметри, які можуть бути пов'язані з сесіями.

Відповіді:

2 для відповіді № 1

Ви в основному не використовуєте 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 для відповіді № 2

Гаразд, я зрозумів, що проблема з моїм сервером. Щойно я перейшов до VPS, це питання вже пішло.