[英]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.