【问题标题】:Yii2 Cookie not generatingYii2 Cookie 未生成
【发布时间】:2020-05-15 05:22:49
【问题描述】:

我正在尝试设置 cookie,但没有保存 cookie。以下是我尝试过的:

$cookies = Yii::$app->response->cookies;

$cookies->add(new \yii\web\Cookie([
        'name' => 'abc',
        'value' => 'xyz',
        'expire' => time() + 86400 * 365,
]));

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

if ($cookies1->has('abc'))
        $cookieValue = $cookies1->getValue('abc');

echo 'value : '.$cookieValue;

echo '<pre>'; print_r($_COOKIE);

$cookieValue 不包含任何值。没有生成 Cookie。我做错了什么?

【问题讨论】:

    标签: cookies yii2 setcookie yii2-advanced-app


    【解决方案1】:

    您的代码很好。您的问题是您试图在在同一个请求中设置然后获取 cookie。

    您的浏览器尚未收到响应,因此在您尝试读出之前它没有机会添加 cookie。

    您只需要在单独的请求中设置然后获取 cookie:

    public function actionSetCookie() {
    
        $cookies = Yii::$app->response->cookies;
    
        $cookies->add(new \yii\web\Cookie([
            'name' => 'abc',
            'value' => 'xyz',
            'expire' => time() + 86400 * 365,
        ]));
    
        echo 'Cookie set!';
    }
    
    public function actionGetCookie() {
    
        $cookies1 = Yii::$app->request->cookies;
    
        if ($cookies1->has('abc'))
            $cookieValue = $cookies1->getValue('abc');
    
        echo 'value : '.$cookieValue;
    }
    

    【讨论】:

    • 我只是这样做了。我在控制器操作中设置了 cookie,然后在我渲染的视图标题中我尝试打印 cookie 值。但是第一次刷新页面时它没有任何值,然后cookie包含该值。
    • 你没有完全理解我,你需要单独请求。在控制器中执行代码然后渲染视图仍然是同一个请求
    • 你明白了。谢谢解释
    【解决方案2】:

    Set your cookie like this

    $cookie = Yii::$app->response->cookies;
    
    $cookie = new \yii\web\Cookie
      ([
            'name' => 'abc',
            'value' => 'xyz',
            'expire' => time() + 86400 * 365,
      ]);
    
    Yii::$app->getResponse()->getCookies()->add($cookie);
    
    //check cookie is exist or not
    
    if(Yii::$app->getRequest()->getCookies()->has('abc'))
    {
         // if exist then get cookie value
         $username =  Yii::$app->getRequest()->getCookies()->getValue('abc');
    }
    

    【讨论】:

    • 嗨维迪亚。该问题与 cookie 的创建/设置无关。我在同一个请求中设置和访问 cookie 的值,这是不可能的。正如@deacs 所提到的,您需要单独请求才能访问 cookie 的值。无论如何感谢您的回答!
    • 嗯,你的问题解决了,这是主要的。但我在同一个函数中设置和访问 cookie。所以我想告诉你,同样的功能是可能的,试一次。
    • 好的。会尝试。谢谢:)
    【解决方案3】:

    只是把我的答案放在这里,因为几次访问这个问题但找不到解决方案。我花了一整天的时间来解决它。所以希望这个答案会对某人有所帮助。

    在我的例子中,我使用了axios 包,它从前端发送了请求,我在标题中得到了响应Set-Cookie,但没有保存在浏览器中。所以设置axios.defaults.withCredentials = true; 解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多