/ / Yii2 tworzy nową sesję zamiast otwierania istniejącego - php, session, yii, yii2

Yii2 tworzy nową sesję zamiast otwierania istniejącego - php, session, yii, yii2

Pracuję nad prostą logiką przechowywania mojego koszyka w sesji przy użyciu natywnego Yii2 yiiwebSession. Za każdym razem, gdy dodaję przedmiot do koszyka, nazywam metodę:

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

ta metoda działa z modelem koszyka i dodaje mój element do sesji:

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

i wszystko idzie dobrze, dopóki nie spróbuję dodać kolejnego przedmiotu. Wtedy Yii zamiast otwierać istniejącą sesję tworzy nową z tym ostatnim elementem, który dodam, co może być przyczyną takiego zachowania?

Pracuję na lokalnym serwerze sieciowym OpenServer i nie zmieniłem żadnego ustawienia, które może być związane z sesjami.

Odpowiedzi:

2 dla odpowiedzi № 1

Zasadniczo nie korzystasz session składnik w ogóle. Zmień swój kod na:

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

Mam nadzieję, że to pomoże. Jeśli nie, oznacza to, że problem jest gdzieś indziej, ale mimo to powinieneś go użyć session składnik prawidłowo.


1 dla odpowiedzi nr 2

Ok, pomyślałem, problem był z moim serwerem. Jak tylko przeniosłem się do VPS ten problem już minął.