Yii - 使用 Cookie

  • 简述

    Cookies 允许跨请求保存数据。在 PHP 中,您可以通过$_COOKIE变量访问它们。Yii 将 cookie 表示为 yii \web\Cookie类的一个对象。在本章中,我们将介绍几种读取 cookie 的方法。
    第 1 步- 在SiteController中创建一个actionReadCookies方法。
    
    public function actionReadCookies() { 
       // get cookies from the "request" component 
       $cookies = Yii::$app->request->cookies; 
       // get the "language" cookie value 
       // if the cookie does not exist, return "ru" as the default value 
       $language = $cookies->getValue('language', 'ru'); 
       // an alternative way of getting the "language" cookie value 
       if (($cookie = $cookies->get('language')) !== null) { 
          $language = $cookie->value; 
       } 
       // you may also use $cookies like an array 
       if (isset($cookies['language'])) { 
          $language = $cookies['language']->value; 
       } 
       // check if there is a "language" cookie 
       if ($cookies->has('language')) echo "Current language: $language"; 
    }
    
    第 2 步- 要查看发送 cookie 的实际效果,请在SiteController中创建一个名为actionSendCookies的方法。
    
    public function actionSendCookies() { 
       // get cookies from the "response" component 
       $cookies = Yii::$app->response->cookies; 
       // add a new cookie to the response to be sent 
       $cookies->add(new \yii\web\Cookie([ 
          'name' => 'language', 
          'value' => 'ru-RU', 
       ])); 
       $cookies->add(new \yii\web\Cookie([
          'name' => 'username', 
          'value' => 'John', 
       ])); 
       $cookies->add(new \yii\web\Cookie([ 
          'name' => 'country', 
          'value' => 'USA', 
       ])); 
    } 
    
    第 3 步- 现在,如果您访问http://localhost:8080/index.php?r=site/send-cookies,您会注意到 cookie 保存在浏览器中。
    保存 Cookie
    在 Yii 中,默认启用 cookie 验证。它可以保护 cookie 在客户端不被修改。config/web.php 文件中的哈希字符串对每个 cookie 进行签名。
    
    <?php 
       $params = require(__DIR__ . '/params.php'); 
       $config = [ 
          'id' => 'basic', 
          'basePath' => dirname(__DIR__), 
          'bootstrap' => ['log'], 
          'components' => [ 
             'request' => [ 
                // !!! insert a secret key in the following (if it is empty) - this is 
                //required by cookie validation 
                'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO', 
             ], 
             'cache' => [ 
                'class' => 'yii\caching\FileCache', 
             ], 
             'user' => [ 
                'identityClass' => 'app\models\User', 
                'enableAutoLogin' => true, 
             ], 
             'errorHandler' => [ 
                'errorAction' => 'site/error', 
             ], 
             'mailer' => [ 
                'class' => 'yii\swiftmailer\Mailer', 
                // send all mails to a file by default. You have to set 
                // 'useFileTransport' to false and configure a transport 
                // for the mailer to send real emails. 
                'useFileTransport' => true, 
             ], 
             'log' => [ 
                'traceLevel' => YII_DEBUG ? 3 : 0, 
                'targets' => [ 
                   [ 
                      'class' => 'yii\log\FileTarget', 
                         'levels' => ['error', 'warning'], 
                    ], 
                ], 
             ], 
             'urlManager' => [ 
                //'showScriptName' => false, 
                //'enablePrettyUrl' => true, 
                //'enableStrictParsing' => true, 
                //'suffix' => '/' 
             ], 
             'db' => require(__DIR__ . '/db.php'), 
          ], 
          'modules' => [ 
             'hello' => [ 
                'class' => 'app\modules\hello\Hello', 
             ], 
          ], 
          'params' => $params,
       ]; 
       if (YII_ENV_DEV) { 
          // configuration adjustments for 'dev' environment 
          $config['bootstrap'][] = 'debug'; 
          $config['modules']['debug'] = [ 
             'class' => 'yii\debug\Module', 
          ]; 
          $config['bootstrap'][] = 'gii'; 
          $config['modules']['gii'] = [ 
             'class' => 'yii\gii\Module', 
          ]; 
       } 
       return $config; 
    ?>
    
    您可以通过将yii\web\Request::$enableCookieValidation属性设置为false来禁用 cookie 验证。