簡體   English   中英

如何在Session(Codeigniter)中存儲對象

[英]How to store objects in Session (Codeigniter)

情況:似乎無法在CI_Session中存儲任何對象,因為在加載模型之前,讀取它們會導致PHP_Incomplete_Object異常,因為會話始終啟動。 這樣,即使自動加載對象類型,我也永遠無法從會話中讀取數據。

我也嘗試過使用“原生會話”,但問題完全相同。

此外,我嘗試存儲序列化的對象,但是在加載所有模型后長時間反序列化時,它仍然成為類型為“__PHP_Incomplete_Class”的對象。

有人知道解決方法嗎? 請保持“你為什么要在會話中找到一個對象”的答案。 看夠了......

不幸的是,php不允許您序列化對另一個對象的引用。 這就是為什么當您還原對象時,它不包含它開始的數據。

我提出的最佳解決方案是在我的模型層中創建一個使用cookie恢復的Session對象。 數據庫中的會話表處理對您原本已序列化的對象的引用。 加載會話模型后,您可以使用它來熱切地或懶洋洋地加載“會話存儲”對象。

此外,如果這些對象持有對其他模型對象的引用,則可以使用相同的原則來遍歷模型層的其余部分,基於關系引用。 這看起來令人生畏,但如果您不熟悉自己實施它,可以查看一些ORM。

我發現的另一個選項是你可以以會話數組值的形式存儲你的對象:

你可以像這樣存儲它:

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

像這樣訪問:

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

到目前為止,我找到的唯一解決方案是將類與控制器一起使用(而不是將其分離為庫)。

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

或者你仍然可以將類保存在'libraries'文件夾中,但是使用經典的require_once而不是$ this-> load-> library('Game')來加載它,這是會話無法處理的對象。

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

class Main extends CI_Controller {
   ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM