Yii 2 將 Cookie 讀寫分離到不同組件:
Yii::$app->response->cookies(Response 物件)Yii::$app->request->cookies(Request 物件)Session 則統一通過 Yii::$app->session 操作。
// 寫法 A:物件導向
$cookie = new \yii\web\Cookie([
'name' => 'smister',
'value' => 'cookieValue',
'expire' => time() + 3600,
'httpOnly' => true, // 防 XSS
]);
Yii::$app->response->cookies->add($cookie);
// 寫法 B:鏈式調用(Yii 2.0.10+)
Yii::$app->response->cookies->add(new \yii\web\Cookie([
'name' => 'token', 'value' => 'abc123', 'expire' => time() + 86400,
]));
$cookies = Yii::$app->request->cookies;
// 獲取值(推薦)
$value = $cookies->getValue('smister'); // 不存在返回 null
$value = $cookies->get('smister'); // 返回 Cookie 物件
// 存在性檢查
if ($cookies->has('smister')) { /* ... */ }
// 計數
$count = $cookies->count(); // 或 $cookies->getCount()
// 刪除單個
$cookie = Yii::$app->request->cookies->get('smister');
Yii::$app->response->cookies->remove($cookie);
// 刪除全部(慎用)
Yii::$app->response->cookies->removeAll();
錯誤:
Yii::$app->request->cookies->remove('name')
正確:必須操作response->cookies,因為刪除本質是發送一個過期的 Set-Cookie 響應頭。
Session 自動啟動(首次讀寫時),無需手動 session_start()。
$session = Yii::$app->session;
// 寫入
$session->set('user_name', 'myname');
$session->set('user_data', [1, 2, 3]); // 支援陣列/物件自動序列化
// 讀取
$name = $session->get('user_name');
$data = $session->get('user_data');
// 刪除
$session->remove('user_name');
$session->removeAll(); // 清空當前 Session
// 閒置超時配置(config/main.php)
'components' => [
'session' => [
'timeout' => 1800, // 30 分鐘
],
],
// config/main.php
'components' => [
'request' => [
'cookieValidationKey' => 'your-secret-key', // 必須設置,用於簽名驗證
'csrfParam' => '_csrf',
],
'response' => [
'format' => \yii\web\Response::FORMAT_JSON,
],
],
// Redis 存儲(高併發推薦)
'components' => [
'session' => [
'class' => 'yii\redis\Session',
'redis' => 'redis', // 需配置 redis 組件
],
],
// 資料庫存儲
'session' => [
'class' => 'yii\web\DbSession',
'sessionTable' => '{{%session}}',
],
httpOnly 方便 JS 除錯Yii::debug($cookies->toArray()) 列印所有 CookieuseTransSid、useCookies、useOnlyCookies 三項配置控制掌握 Yii 2 的 Request/Response 分離模型 是正確操作 Cookie 的關鍵。Session 則提供了統一、可插拔的存儲抽象。建議在項目初期統一規劃 Cookie 域、路徑、安全標誌,並根據業務量級選擇 Session 存儲引擎,避免後期遷移成本。