2012-02-19 25 views
3

状況:CI_Sessionにオブジェクトを格納することは不可能です。セッションを常に開始するので、モデルを読み込む前にPHP_Incomplete_Object例外が読み込まれるためです。 このように、オブジェクトのタイプをオートロードする場合でも、私は決してセッションからデータを読み取ることができません。Session(Codeigniter)にオブジェクトを格納する方法

「ネイティブセッション」も試してみましたが、そこには全く同じ問題があります。

さらに、私はオブジェクトを直列化して保存しようとしましたが、すべてのモデルをロードした後に長い直列化を解除すると、それはまだタイプ "__PHP_Incomplete_Class"のオブジェクトになります。

誰かが回避策を知っていますか?そして、「なぜあなたはセッション中のオブジェクトを望みますか?」と答えてください。それらの数は十分です...

答えて

4

残念ながら、phpでは、あるオブジェクトへの参照を別のオブジェクトから直列化することはできません。このため、オブジェクトの復元時には、開始したデータは含まれません。

私が思いついた最善の解決策は、クッキーを使用して復元されたモデルレイヤーにセッションオブジェクトを作成することです。データベース内のセッションテーブルは、そうでなければシリアル化したオブジェクトへの参照を処理します。セッションモデルがロードされたら、それを使用して「セッションが保存された」オブジェクトを熱心にまたは遅延して読み込むことができます。

これらのオブジェクトが他のモデルオブジェクトへの参照を保持している場合は、同じ原則を使用してモデルレイヤーの残りの部分を、関係参照に基づいてトラバースすることができます。これは難しいように思えるかもしれませんが、あなたが自分でそれを実装するのが快適ではないとあなたがチェックアウトできるいくつかのORMがあります。

+0

ありがとう。しかし、オブジェクトをセッションに格納することは、データベースへのクエリの数を減らす(例えば、ユーザの全ACLを保持する)と考えられていた。オブジェクトデータを意味のある*配列のセットに変換し、それをsession-> userdataに書き込むことで、私はそれを取り巻いて作業しました。 – DerShodan

0

私が見つけたもう一つのオプションは、セッションの配列値の形であなたのオブジェクトを格納できることです。

あなたはこのようにそれを保存することができます。このような

$this->session->set_userdata($yourObject); 

アクセス:

$this->session->userdata['property name of your object']; 
0

私が今までに見つけた唯一の解決策は、 (ライブラリとして分離されているのではなく)コントローラを使用します。

それほど上品ではありませんが、何らかの理由でそれは動作しますが、CIライブラリインスタンスは動作しません。そこで、基本的

class Main extends CI_Controller { 

    public function index() {   
     $game = new Game(); 
     echo $game->id; 
     $this->session->set_userdata('game',$game); 
    } 

    public function restore_game() {   
     $game = $this->session->userdata('game'); 
     echo $game->id; 
    } 

} 

class Game { 
    public $id; 

    public function __construct() { 
     $this->id = rand(0,100); 
    } 
} 

それとも、まだ「ライブラリ」フォルダ内のクラスを維持するが、代わりに$ this-> load-> libraryメソッド(「ゲーム」)の古典のrequire_onceでそれを読み込むことができましたセッションが処理できない種類のオブジェクトです。

require_once(APPPATH . 'libraries/Game.php'); 

class Main extends CI_Controller { 
    ... 
} 
関連する問題