我想出的一个解决方案是使用会话,它易于使用且“快速”,您需要进行一些基准测试。
正如我在上面/下面的两个答案中所评论的那样,您无法在不同的控制器中获得相同的数据,因为每个请求都是“重置”的,并且要到达不同的控制器,您至少需要重新加载页面。(注意,即使是 AJAX 调用也会发出新请求)
请注意,会话受大小限制,您有 4kb 的限制(CodeIgniter 将会话存储为 Cookie)但是等等,有办法将它们存储在 DB 中(以允许此转到配置文件并将其打开$config['sess_use_database'] = TRUE;
+ 创建表,您将在这里找到更多)
好吧,让我们自己来回答吧,据我了解,如果不这样做,您尝试扩展所有控制器,并将一些代码放在该 core/MY_Controller.php 文件中,如下所示:
private function _initJSONSession() { //this function should be run in MY_Controller construct() after succesful login, $this->_initJSONSession(); //ignore return values
$json_session_data = $this->session->userdata('json');
if (empty($json_session_data )) {
$json_session_data['json'] = array(); //your default array if no session json exists,
//you can also have an array inside if you like
$this->session->set_userdata($ses_data);
return TRUE; //returns TRUE so you know session is created
}
return FALSE; //returns FALSE so you know session is already created
}
你还需要这几个函数,它们是自我解释的,它们都是公共的,所以你可以在任何由 MY_Controller.php 扩展的控制器中自由使用它们,就像这样
$this->_existsSession('json');
public function _existsSession( $session_name ) {
$ses_data = $this->session->userdata( $session_name );
if (empty( $ses_data )) return FALSE;
return TRUE;
}
public function _clearSession($session_name) {
$this->session->unset_userdata($session_name);
}
public function _loadSession($session_name) {
return (($this->_existsSession( $session_name )) ? $this->session->userdata($session_name) : FALSE );
}
最有趣的功能是_loadSession()
,它是一种自我解释,我花了一段时间才完全理解会话本身,简而言之,您需要获取(加载)已经在会话中的数据,用它做一些事情([CRUD] 像添加新数据,或删除一些数据),然后在同一会话中放回(REWRITE )所有数据。
让我们来看这个例子:
请记住,会话就像 2d 数组(我自己使用 4+5d 数组)
$session['session_name'] = 'value';
$session['json'] = array('id' => '1', 'name' => 'asok', 'some_array' => array('array_in_array' => array()), 'etcetera' => '...');
所以在你使用的会话中写新的(重写)的东西
{
$session_name = 'json';
$session_data[$session_name] = $this->_loadSession($session_name);
//manipulate with array as you wish here, keep in mind that your variable is
$session_data[$session_name]['id'] = '2'; // also keep in mind all session variables are (string) type even (boolean) TRUE translates to '1'
//or create new index
$session_data[$session_name]['new_index'] = FALSE; // this retypes to (string) '0'
//now put session in place
$this->session->set_userdata($session_data);
}
如果您想使用自己的功能add_data()
,则需要这样做
- 好吧,您需要先将一些数据传递给它
add_data($arr = array(), $data = ''){}
例如:array_unshift( $arr, $data );
{
//your default array that is set to _initJSONSession() is just pure empty array();
$session_name = 'json';
$session_data[$session_name] = $this->_loadSession( $session_name );
// to demonstrate I use native PHP function instead of yours add_data()
array_unshift( $session_data[$session_name], 'sample-data' );
$this->session->set_userdata( $session_data );
unset( $session_data );
}
这就对了。