Invalid Call – yii\base\InvalidCallException

The cookie collection is read only.

在使用Yii2进行cookie操作时会报以上错误多半是使用了如下的方式来获取cookie容器而导致的

$cookieObj = Yii::$app->request->cookies;

处理方式有两种:

第一种方式,设置readOnly属性为false:
处理方式为:

$cookieObj->readOnly = false; //关闭只读保护

第二种方式,使用response来实例化cookie容器

$cookie = Yii::$app->response->cookies;
$cookie->add(new Cookie([
'name' => 'goods_cart',
'value' => '100'
]));


导致这个问题的原因是request和response实例化的容器中的readOnly属性的值不同,分别打印的结果如下:

$cookieObj = Yii::$app->request->cookies;
var_dump($cookieObj);


$cookie = Yii::$app->response->cookies;
var_dump($cookie);exit;


object(yii\web\CookieCollection)#56 (2) { ["readOnly"]=> bool(true) ["_cookies":"yii\web\CookieCollection":private]=> array(1) { ["_csrf-frontend"]=> object(yii\web\Cookie)#63 (7) { ["name"]=> string(14) "_csrf-frontend" ["value"]=> string(32) "JE6d52sN6RdCai-RNDGVYrfpKQ1p0W5_" ["domain"]=> string(0) "" ["expire"]=> NULL ["path"]=> string(1) "/" ["secure"]=> bool(false) ["httpOnly"]=> bool(true) } } }

object(yii\web\CookieCollection)#65 (2) { ["readOnly"]=> bool(false) ["_cookies":"yii\web\CookieCollection":private]=> array(0) { } }


可以看到response默认为true这也是为了cookie安全考虑一个为有加密的值。

posted on 2019-08-12 12:32  夏沫忆香  阅读(664)  评论(0编辑  收藏  举报