我创建了一个自定义会话模型(我认为)可以工作,我在我的动作控制器中有两个测试操作。
第一个动作是:
public function testAction() {
$session = Mage::getSingleton('mymodule/session');
$session->func1('x');
$var1 = Mage::getSingleton('mymodule/session');
//Tracing through this function reveals that everything behaves as expected,
//$session is created, modified and then when $var1 is created, the same
//reference is returned and the two references refer to the same object
//($session === $var1) = true
}
第二个动作是:
public function testresultAction() {
$session = Mage::getSingleton('mymodule/session');
var_dump($session);
//this method does not appear to work, and upon tracing through the
//getSingleton it is in fact creating a new session object, NOT returning
//the one that already existed.
}
我的会话类看起来像这样:
class Mystuff_Mymodule_Model_Session extends Mage_Core_Model_Session_Abstract {
public function __construct() {
$namespace = 'Mystuff_Mymodule';
$this->init ( $namespace );
Mage::dispatchEvent ( 'mymodule_session_init', array (
'mymodule_session' => $this
) );
$this->setData('history', [] );
$this->setIndex ( - 1 );
}
public function func1($historyElement){
$history = $this->getData( 'history' );
array_unshift ( $history, $historyElement);
while ( count ( $history ) > 10 ) {
array_pop ( $history );
}
$this->setData ('history', $history);
$this->setIndex(-1);
}
}
我还在其他点将testresultAction修改为var_dump($_SESSION)
,当我这样做时似乎有数据
那么,为什么,当我调用我的testAction()
并创建单例和编辑数据时,对testresultAction()
的并发调用是否存在修改后的数据,为什么它没有得到以前实例化的单身人士?
答案 0 :(得分:1)
你是对的。由于PHP是无状态的,因此在请求 - 响应生命周期中仅存在未放入会话的数据。使用getSingleton
,您只需获取已实例化的对象(如果已生成它)。
答案 1 :(得分:1)
存在执行范围的单身人士(如你所知)。然而,会话模型实例可以存储&从会话存储中检索数据,这意味着虽然您无权访问同一模型实例,但您确实拥有实例属性的持久存储。
因此,在一个执行范围内,您可以:
$session = Mage::getSingleton('core/session');
$session->setFoo(array('bar'));
//$session->_data['foo'] = array(0=>'bar')
//aka $_SESSION['core'][0]['bar']
然后在下一个执行范围内:
$session = Mage::getSingleton('core/session');
var_dump($session->getFoo()); //array (size=1){ 0 => string 'bar' (length=3) }
我认为您没有看到$history
因为每次初始化会话模型时都会用
$this->setData('history', [] );
答案 2 :(得分:0)
对于那些最后遇到单身人士问题的人
Magento单身人士只在页面生命期内持续
它们依赖于注册表模式,不持续多个页面。
至于我的数据丢失的原因,那是因为它创建了一个新的单例(因为它是一个不同的动作,因而是一个不同的页面),它重新初始化数组为空
我无法找到任何文件来验证单身人士/注册表的生命周期,所以如果有人发现,请在此处评论/编辑,以确保完整性