CakePHP 3 - Cookie

时间:2016-02-11 15:23:51

标签: cakephp cookies cakephp-3.0

我在读取cookie中的关联数组时遇到问题。

  1. 当我在控制器中这样设置时:

    $this->set('info', $this->Cookie->read('info'));
    

    我可以在视图中以这种方式读取数据:

    $info[0]['records'];
    

    ['person_id'=> 2,...]

    1. 当我这样做时(因为我从一个视图单元中读取了cookie):

      $this->set('info', $this->request->cookie('info'));
      

      我将关联数组作为字符串。 (?)整个数组是一个字符串:

      '。''[{“person_id”:2,...“}}''。'

      那么,我怎么能'避免'这个?为什么它通过'request'成为String?

      编辑:

      在CakePHP中,当您尝试通过“请求”(2.)检索cookie时,通常会获得cookie的哈希值。创建cookie时,我禁用了散列。也许我没有正确地做到这一点。

      是否也可以在视图单元格中取消它?

1 个答案:

答案 0 :(得分:0)

你有一个JSON字符串。

Cookie组件默认存储JSON编码的所有数据,并且还加密(默认情况下为AES)。因此,它还会在读取cookie时对数据进行解密和解码。

当cookie未加密时,您可以轻松地对其进行JSON解码。

$decoded = json_decode($encoded, true);

如果您也使用加密,并且/或者您不确定该值是否为JSON编码,您可以使用Cookie组件在控制器级别解密/解码Cookie,例如

$this->request->coookies['info'] = $this->Cookie->read('info');

或将其设置为视图变量,您可以将其作为参数传递给您的单元格。

另请参阅 Cookbook > Views > View Cells > Passing Arguments to a Cell

从CakePHP 3.1.7开始,您也可以使用cookie组件使用的\Cake\Utility\CookieCryptTrait特征。只需将其添加到您的类中,实现CookieCryptTrait::_getCookieEncryptionKey()方法即可返回正确的加密密钥(默认情况下为安全盐),并使用CookieCryptTrait::_decrypt()来解密cookie数据。

另请参阅 API > \Cake\Utility\CookieCryptTrait

虽然这可以在一个单元中工作,但“问题”是单元需要知道来自外部世界的东西才能使其工作,它需要知道加密密钥和加密模式。就个人而言,我可能会使用前一种方法,如果它需要是后者,则将密钥和模式作为参数传递给单元格。