2012-02-19 36 views
3

情況:似乎不可能將任何對象存儲在CI_Session中,因爲在加載模型之前,讀取它們會導致PHP_Incomplete_Object異常,因爲會話始終啓動。 這樣,即使在自動載入對象類型時,我也無法讀取會話中的數據。如何在會話中存儲對象(Codeigniter)

我也嘗試使用「本機會話」,但它存在完全相同的問題。

此外,我試圖存儲序列化的對象,但是當加載所有模型後很長的反序列化時,它仍然變成了類型爲「__PHP_Incomplete_Class」的對象。

任何人都知道解決方法?請保留「你爲什麼要在會話中使用對象」的答案。足夠的那些...

回答

4

不幸的是,PHP不允許你序列化從另一個對象的引用。這就是爲什麼當你恢復你的對象時,它不包含它開始的數據。

我提出的最佳解決方案是在我的模型層中創建一個Session對象,該對象使用cookie進行恢復。數據庫中的會話表處理對您將要序列化的對象的引用。一旦你的會話模型被加載,你可以使用它來加載'session stored'對象,熱切或懶惰地加載。另外,如果這些對象持有對其他模型對象的引用,則可以使用相同的原則根據關係引用遍歷模型圖層的其餘部分。這看起來令人望而生畏,但是如果你不願意自己實現它,你可以檢查一些ORM。

+0

感謝您的意見。但是,將對象存儲在會話中應該減少對數據庫的查詢次數(例如,保存用戶的完整ACL)。我現在通過將對象數據轉換爲一組*有意義的數組並將其寫入session-> userdata來解決它。 – DerShodan 2012-02-19 11:33:08

0

我發現另一種選擇是,你可以在你的對象存儲在session數組值的形式:

你可以將其存儲這樣的:

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

訪問是這樣的:

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

到目前爲止我發現的唯一解決方案是讓班級成員r與控制器(而不是作爲庫分開)。

不是很優雅,但由於某種原因,它工作,而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); 
    } 
} 

或者你仍然可以保持類中的「庫」文件夾,但採用了經典的require_once而不是$這個 - >負載>庫(「遊戲」),加載其是會話無法處理的那種對象。

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

class Main extends CI_Controller { 
    ... 
}