Magento会话getSingleton失败

时间:2013-07-10 15:31:40

标签: php magento session

我创建了一个自定义会话模型(我认为)可以工作,我在我的动作控制器中有两个测试操作。

第一个动作是:

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()的并发调用是否存在修改后的数据,为什么它没有得到以前实例化的单身人士?

3 个答案:

答案 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单身人士只在页面生命期内持续

它们依赖于注册表模式,持续多个页面。

至于我的数据丢失的原因,那是因为它创建了一个新的单例(因为它是一个不同的动作,因而是一个不同的页面),它重新初始化数组为空

我无法找到任何文件来验证单身人士/注册表的生命周期,所以如果有人发现,请在此处评论/编辑,以确保完整性