我知道可以通过这种方式将多个值设置为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}
。不是数组。
当我为“数据2”创建gettype
时,输出为“string”
因此,当我$data["john"]=20
时,我得到Illegal string offset error
因为$data
是字符串而不是数组。
因此,无法在一个动作中逐个设置相同的cookie吗?
编辑: 当我创建一个数据数组时,json_encode表示该数组并将其内容写入cookie。然后在另一个控制器中,当我读取cookie内容并将其分配给变量时,它会自动转换为Array。
答案 0 :(得分:1)
以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