Осмотрев интернет в течение нескольких дней, я решил попросить вашу помощь здесь.
У меня возникла проблема с управлением контейнером сеансов Zend Framework 2. Я не понимаю, почему, но структура опустошала все мои контейнеры каждый раз, когда я меняю страницу.
Мой случай прост, я строю интернет-магазин:
Вот фрагмент кода:
// Create container to add product $container = new Zend\Session\Container('frontCart'); // Add product to cart $container->offsetSet('frontCartContent', array(1 => serialize($my_product_object));
Если я сделаю отладку сеанса сразу после добавления:
Debug::dump($_SESSION); // Display this : ["frontCart"] => object(Zend\Stdlib\ArrayObject)#70 (4) { ["storage":protected] => array(1) { ["frontCartContent"] => array(1) { [1] => string(1175) "my serialized product object" } } ["flag":protected] => int(2) ["iteratorClass":protected] => string(13) "ArrayIterator" ["protectedProperties":protected] => NULL }
Затем, если я просто перезагружаю страницу или переключаюсь с:
http://mydomain.com/products_list/my_product
в
http://mydomain.com/products_list
Я получил :
Debug::dump($_SESSION); // Display this : ["frontCart"] => NULL
Пожалуйста, помогите 🙁 Я вообще не понимаю, почему ZF2 имеет такое поведение, и это очень проблематично для клиента интернет-магазина, если он не может добавить и по продуктам.
Спасибо
РЕДАКТИРОВАТЬ
Следующим требованием Тима здесь является больше кода.
Я инициализирую свой контейнер сеанса в конструкторе контроллера
public function __construct() { if (!$this->sessionCart) { $this->sessionCart = new Container(ConstantSession::FRONT_CART); } }
Затем, вот точный способ добавления продукта в контейнер
$this->sessionCart->offsetSet(ConstantSession::FRONT_CART_CONTENT, array($cartNumber => serialize($product)) );
$ cartNumber увеличивается после количества продуктов в корзине (когда он будет работать). $ product – объект со всеми его свойствами.
EDIT 2
Следуя советам Тима, я изменил код «добавить в корзину», чтобы:
$this->sessionCart->frontCartContent = array($cartNumber => $product);
Когда я хочу вернуть содержимое сеанса, я создаю новый экземпляр контейнера:
// Init new container $container = new Zend\Session\Container('frontCart'); // Get the content $container->frontCartContent;
Если я сделаю Debug :: dump () последней строки, я все равно получаю NULL после смены страницы.
В коде есть несколько проблем. Пытаться:
// Create container to add product $container = new Zend\Session\Container('cart'); // Add product to cart $container->frontCartContent = array($my_product_object);
то на другой странице вам нужно создать контейнер снова с тем же параметром, который вы использовали выше, а затем проверить содержимое. Не просто $_SESSION
:
$container = new Zend\Session\Container('cart'); var_dump($container->frontCartContent);
Посмотрите, дает ли это лучшие результаты.