如何在Yii2中设置Cookie的纯值(无json) - php

我使用以下代码在Yii2中设置cookie:

$cookies = Yii::$app->response->cookies;
$cookies->add(new \yii\web\Cookie([
    'name' => 'googtrans',
    'value' => '//fa',
    'expire' => time()+(60*60*24*365),
]));

当我在浏览器中检查cookie管理器时,会看到以下内容:

378abb4ba4b3ed4bd5fa0918a34e0ba6c4042aecd590d167d76f6a901660d082a%3A2%3A%7Bi%3A0%3Bs%3A9%3A%22googtrans%22%3Bi%3A1%3Bs%3A4%3A%22%2F%2Ffa%22%3B%7D

解码后,我看到:

378abb4ba4b3ed4bd5fa0918a34e0ba6c4042aecd590d167d76f6a901660d082a:2:{i:0;s:9:"googtrans";i:1;s:4:"//fa";}

似乎Yii2自动将cookie数据转换为JSON格式。

但是我不需要这个,我想使用一个googtrans名称和//fa值的cookie值。
(我了解PHP核心中的$_COOKIE,但我想使用Yii)

我该怎么做?

参考方案

不是JSON。它在散列之前使用PHP的serialize方法:

// retrieved from yii\web\Response::sendCookies()
$value = $cookie->value;
if ($cookie->expire != 1  && isset($validationKey)) {
    $value = Yii::$app->getSecurity()->hashData(serialize([$cookie->name, $value]), $validationKey);
}
setcookie($cookie->name, $value, $cookie->expire, $cookie->path, $cookie->domain, $cookie->secure, $cookie->httpOnly);

参见完整代码here。

事实是,只要$enableCookieValidation设置为true(默认情况下就是这种情况),Yii就会这样做以验证接收到的cookie是否受到篡改。

因此,您可能需要使用这些配置完全禁用内置的Cookie验证:

'request' => [
    'enableCookieValidation' => false,
    'enableCsrfValidation' => false,
]

但是我不推荐使用它,因为出于安全原因需要以这种方式进行构建。要在Yii应用程序中的任何位置解码cookie的值,您始终可以按照official docs中的说明进行操作:

$cookies = Yii::$app->request->cookies;
if (($cookie = $cookies->get('googtrans')) !== null) {
    $googtrans = $cookie->value;
}

否则,如果您需要的是客户端能够读取某些cookie的真实值,那么我建议使用$_COOKIE来直接设置/获取它,正如其创建者here所建议的那样。

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

PHP:对数组排序 - php

请如何排序以下数组Array ( 'ben' => 1.0, 'ken' => 2.0, 'sam' => 1.5 ) 至Array ( 'ken' => 2.0, 'sam' => 1.5, 'ben' =&…

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…

PHP-全局变量的性能和内存问题 - php

假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…

PHP PDO组按列名称查询结果 - php

以下PDO查询返回以下结果:$db = new PDO('....'); $sth = $db->prepare('SELECT ...'); 结果如下: name curso ABC stack CDE stack FGH stack IJK stack LMN overflow OPQ overflow RS…