2009-07-05 4 views
1

こんにちは、Zend Framework 1.7.6を使用している私のセッションに問題があります。Zend_Sessionでノードが存在しなくなった

セッションに配列を格納しようとすると問題が発生します。セッション名前空間には他のユーザーデータも格納されます。

私は現在、私は、これがerroringていると思うのコード

 
Fatal error: Uncaught exception 'Zend_Session_Exception' with message 'Zend_Session::start() - 
... 

Error #2 session_start() [function.session-start]: Node no longer exists Array 

私のスタックトレースに次のメッセージを取得しています

:このエラーは、ANを追加しようとしているので、出現し始めている

//now we add the user object to the session 
    $usersession = new Zend_Session_Namespace('userdata'); 
    $usersession->user = $user; 

    //we now get the users menu map   
    $menuMap = $this->processMenuMap($menuMapPath); 

    $usersession->menus = $menuMap; 

配列をセッション名前空間に追加します。

何が原因で発生する可能性がありますノードは存在しません。アレイメッセージ?

感謝

答えて

3

あなたは、セッションデータに関連するSimpleXMLオブジェクトまたは何か他のlibxmlを保存しようとしていますか?
session_start()の間にオブジェクトがシリアル化されていないときに、基底のDOMツリーが復元されないため、これは機能しません。代わりにxmlドキュメントを(文字列として)格納します。

"magic functions" __sleep() and __wakeup()を入力してください。しかし、__sleep()は、シリアル化されるすべてのプロパティの名前を持つ配列を返す必要があります。別のプロパティを追加する場合は、その配列を変更する必要があります。それは自動化のいくつかを削除します...

menumapクラスにはいくつかのプロパティがある場合は、あなたのために実現可能性があります。

<?php 
class MenuMap { 
    protected $simplexml = null; 
    protected $xmlstring = null; 

    public function __construct(SimpleXMLElement $x) { 
     $this->simplexml = $x; 
    } 

    public function __sleep() { 
     $this->xmlstring = $this->simplexml->asXML(); 
     return array('xmlstring'); 
    } 

    public function __wakeup() { 
     $this->simplexml = new SimpleXMLElement($this->xmlstring); 
     $this->xmlstring = null; 
    } 

    // ... 
} 
+0

私はsimplexmlを使用します。私のメニュー/サイトマップはXMLファイルに保存されています。私はそれらを試して、配列に格納されたメニューオブジェクトに格納します。私がやろうとしていることを達成できる方法はありますか? –

1

セッションにXML文字列を保存する必要があります。

  • __sleep() and __wakeup()メソッドを実装しSerializableインタフェースを実装します。また、あなたはどちらかということXML文字列のラッパークラスを作成することができます。

これらの方法では、オブジェクトの状態を気にすることができます。

+0

ここでシリアライズ可能な実装は、私の__sleep/__ wakeの例よりも優れています。 – VolkerK