CakePHP将多个值设置为一个cookie

时间:2013-11-01 22:51:59

标签: php cakephp cookies

我知道可以通过这种方式将多个值设置为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。

1 个答案:

答案 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