3

我想要一个可以通过控制器函数访问的全局数组,它们可以添加或删除具有特定键的任何项目。我该怎么做呢?我已经制作了我的自定义控制器“ globals.php”并将其添加到自动加载库中。

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  $notification_array = array();
  $config['notification'] = $notification_array;
?>

控制器上的以下功能应将新项目添加到我的数组

function add_data(){
   array_unshift($this->config->item('notification'), "sample-data");
}

add_data 添加到全局数组后,每当从客户端调用以下函数时,它应该将更新后的数组提供给客户端。

function send_json()
{
   header('content-type: application/json');
   $target = $this->config->item('notification');
   echo json_encode($target);
}

但是我的客户总是得到空数组。我怎样才能做到这一点?请帮忙。

4

3 回答 3

1

我想出的一个解决方案是使用会话,它易于使用且“快速”,您需要进行一些基准测试。

正如我在上面/下面的两个答案中所评论的那样,您无法在不同的控制器中获得相同的数据,因为每个请求都是“重置”的,并且要到达不同的控制器,您至少需要重新加载页面。(注意,即使是 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(),则需要这样做

  1. 好吧,您需要先将一些数据传递给它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 );
}

这就对了。

于 2013-09-19T09:31:59.200 回答
1

嗨利用 OOP,像这样

// 将 MY_Controller.php 放在 core 目录下

class MY_Controller extends CI_Controller{

  public $global_array = array('key1'=>'Value one','key2'=>'Value2'):

   public function __construct() {
        parent::__construct();
    }

}

//页面控制器

class Page extends MY_Controller{

public function __construct() {
            parent::__construct();
        }

function send_json()
{
   header('content-type: application/json');
   $target = $this->global_array['key1'];
   echo json_encode($target);
}

}
于 2013-09-18T17:07:57.290 回答
0

您可以为每个控制器添加一个“全局”数组。

在控制器的顶部:

public $notification_array = array();

然后要在您将使用的不同功能中访问它:

$this->notification_array;

因此,如果您想向其中添加项目,您可以执行以下操作:

$this->notification_array['notification'] = "Something";
$this->notification_array['another'] = "Something Else";
于 2013-09-18T17:05:48.590 回答