1

我知道可以通过这种方式将多个值设置为 cookie:

If you want to write more than one value to the cookie at a time,
    you can pass an array:

$this->Cookie->write('User',
    array('name' => 'Larry', 'role' => 'Lead')
);

由于一些设计问题,我需要在控制器操作的不同部分设置 cookie 值。但似乎这个最小化的代码不起作用:

public function myfunction() {
    $text = "";
    // to be sure that this cookie doesn't exist
    $this->Cookie->delete('mycookie');
    // getting data from cookie, result is NULL
    $data = $this->Cookie->read('mycookie');
    $text .= "data 1 type: ".gettype($data)."<br>";
    $key="mike";
    $value=12;
    // adding key-value to cookie
    $data[$key] = $value;
    // serializing and writing cookie
    $dataS = json_encode($data);
    $this->Cookie->write('mycookie', $dataS, FALSE, '10 days');

    // reading cookie again, but this time result is
    // string {"mike":12} not an array
    $data = $this->Cookie->read('mycookie');
    $text .= "data 2 type: ".gettype($data)."<br>";
    $key="john";
    $value=20;
    // Illegal string offset error for the line below
    $data[$key] = $value;
    $dataS = json_encode($data);
    $this->Cookie->write('mycookie', $dataS, FALSE, '10 days');

    echo $text;

}

页面输出:

Warning (2): Illegal string offset 'john' [APP/Controller/MyController.php, line 2320]  
data 1 type: NULL   
data 2 type: string  

从上面的代码中,“Mike 12”成功设置为 cookie。但是当我第二次读取 cookie 数据时,我得到一个像这样的字符串:{"mike":12}. 不是数组。

当我gettype为“数据2”制作时,输出是“字符串”。
所以当我让$data["john"]=20我得到Illegal string offset error因为$data是字符串而不是数组。

那么不可能在一个动作中一个一个地设置相同的cookie吗?

编辑:当我创建一个数据数组时,json_encode 该数组并将其内容写入 cookie。然后在另一个控制器中,当我读取该 cookie 内容并将其分配为一个变量时,它会自动转换为 Array。

4

1 回答 1

2

以 JSON 格式编码和解码数据是 Coookie 组件的内部功能,您的应用程序不应依赖它!实现可能会改变,你的代码会中断。

目前,只有在实际从 cookie 中读取数据时才会对 JSON 数据进行解码,这需要新的请求。在同一个请求中,您将访问组件缓冲的原始数据。

因此,您应该遵循约定并传递一个数组,而不是这个 JSON 事物:

$data = array();

$key = 'mike';
$value = 12;

$data[$key] = $value;

$this->Cookie->write('mycookie', $data);

// ... do some stuff, and then somewhere else:

$data = $this->Cookie->read('mycookie');

$key = 'john';
$value = 20;

$data[$key] = $value;
$this->Cookie->write('mycookie', $data);

或使用点表示法(这将导致多个 cookie):

$key = 'mike';
$value = 12;
$this->Cookie->write('mycookie.' . $key, $value);

// ... do some stuff, and then somewhere else:

$key = 'john';
$value = 20;
$this->Cookie->write('mycookie.' . $key, $value);

另见http://book.cakephp.org/2.0/en/core-libraries/components/cookie.html#using-the-component

于 2013-11-01T23:59:26.713 回答