页面之间的ZF2空会话容器

时间:2014-02-23 10:57:55

标签: session zend-framework zend-framework2 php

在网上浏览了几天后,我决定在这里寻求帮助。

我遇到了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有这种行为,如果他不能添加产品,这对于网上商店客户来说是非常有问题的。

THX

修改

根据蒂姆的要求,这里有更多代码。

我在控制器的构造函数

中初始化我的会话容器
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是一个具有所有属性的对象。

编辑2

根据Tim的建议,我将“添加到购物车”代码更改为:

$this->sessionCart->frontCartContent = array($cartNumber => $product);

当我想要恢复我的会话内容时,我创建了一个新的Container实例:

// Init new container
$container = new Zend\Session\Container('frontCart');

// Get the content
$container->frontCartContent;

如果我创建了最后一行的Debug :: dump(),我在更改页面后仍然会得到NULL。

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。尝试:

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

看看是否能给你带来更好的效果。