24

我正在寻找一些有关 Magento 中可用的不同会话类型的差异的信息。

有一个核心会话、一个客户会话和一个结帐会话。但我不太确定何时使用哪一个以及它们的行为方式可能会有所不同。它们是否都在同一时间有效,或者结帐会话是否比核心会话更早失效?

4

1 回答 1

26

好问题!

直接回答这个问题:所有会话模型的生命周期都是相同的。会话生命周期由 Magento 和您的服务器软件中的配置决定。您可能想要问的问题(以 Magento 处理各种会话的方式)是“给定会话类型的数据持续了多长时间?”

答案是实现之一,因此最好的方法是在代码中搜索实例化点。要使用的搜索模式是getSingleton('core/session')(或任何会话模型)。任何调用它的地方——如果它是第一次遇到它——将在$_SESSION超全局中创建会话命名空间(如下所述)。

因此,会话永远不会“被杀死”,但数据会根据实现而被清除。臭名昭著的是checkout/session,因为在下订单后数据会被擦除。

除此之外,您可以依靠该会话来满足您的持久性需求。

Magento 中的会话模型使用抽象基类来定义各种 API Mage_Core_Model_Session_Abstract,. 此类填充以下角色/功能:

  1. 通过该方法的会话命名空间init(),字面上分离下每种类型的存储值$_SESSION[$namespace]
  2. 用于(连接到)会话相关配置设置(包括 cookie 生命周期、SID、安全设置等)的 Getter
  3. Flash 消息存储和检索(addError()addMessage()addNotice()addSuccess()
  4. 会话存储配置和方法的getter
  5. 通过Varien_Object::__call(). *请注意,会话有一个修改后的魔法 getter,它允许您从会话中检索数据并通过一次调用取消设置(例如$session->getSomeParam(true)

因此,如果您希望您的模块拥有自己的会话命名空间,只需将会话模型声明为从会话摘要和受保护的_construct()调用中扩展即可$this->init('namespace')

会话模型的所有数据都将设置在会话命名空间下的数组键中;对于核心,这将是:

$session = Mage::getSingleton('core/session')->setSomeValue('Some string');

可以表示为

$_SESSION['core']['some_value'] = 'Some string'
于 2012-03-21T13:32:30.410 回答