亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

directory search
閱讀前篇 簡介 Yii 是什么 從 Yii 1.1 升級 入門 安裝 Yii 運(yùn)行應(yīng)用 第一次問候 使用Forms 數(shù)據(jù)庫應(yīng)用 使用 Gii 生成代碼 進(jìn)階 應(yīng)用結(jié)構(gòu) 概述 入口腳本 應(yīng)用(Applications) 應(yīng)用組件(Application Components) 控制器(Controllers) 模型(Models) 視圖(views) 模塊(Modules) 過濾器(Filters) 小部件(Widgets) 前端資源(Assets) 擴(kuò)展(Extensions) 請求處理 運(yùn)行概述 啟動引導(dǎo)(Bootstrapping) 路由和創(chuàng)建URL 請求(Requests) 響應(yīng)(Responses) Sessions 和 Cookies 錯誤處理(Handling Errors) 日志(Logging) 關(guān)鍵概念 組件(Component) 屬性(Property) 事件(Events) 行為(Behaviors) 配置(Configurations) 別名(Aliases) 類自動加載(Autoloading) 服務(wù)定位器(Service Locator) 依賴注入容器(Dependency Injection Container) 配合數(shù)據(jù)庫工作 數(shù)據(jù)庫訪問 (Data Access Objects) 查詢生成器(Query Builder) 活動記錄(Active Record) 數(shù)據(jù)庫遷移(Migrations) Sphinx Redis MongoDB Elasticsearch 接收用戶數(shù)據(jù) 創(chuàng)建表單(Creating Forms) 輸入驗(yàn)證(Validating Input) 文件上傳(Uploading Files) 收集列表輸入(Collecting Tabular Input) 多模型的復(fù)合表單(Getting Data for Multiple Models) 顯示數(shù)據(jù) 格式化輸出數(shù)據(jù)(Data Formatting) 分頁(Pagination) 排序(Sorting) 數(shù)據(jù)提供器(Data Providers) 數(shù)據(jù)小部件(Data Widgets) 客戶端腳本使用(Working with Client Scripts) 主題(Theming) 安全 認(rèn)證(Authentication) 授權(quán)(Authorization) 處理密碼(Working with Passwords) 客戶端認(rèn)證(Auth Clients) 最佳安全實(shí)踐(Best Practices) 緩存 概述 數(shù)據(jù)緩存 片段緩存 頁面緩存 HTTP 緩存 RESTfull Web服務(wù) 快速入門(Quick Start) 資源(Resources) 控制器(Controllers) 路由(Routing) 格式化響應(yīng)(Response Formatting) 授權(quán)認(rèn)證(Authentication) 速率限制(Rate Limiting) 版本(Versioning) 錯誤處理(Error Handling) 開發(fā)工具 調(diào)試工具欄和調(diào)試器 使用Gii生成代碼 生成API文檔 測試 概述(Overview) 配置測試環(huán)境(Testing environment setup) 單元測試(Unit Tests) 功能測試(Function Tests) 驗(yàn)收測試(Acceptance Tests) 測試夾具(Fixtures) 高級專題 高級應(yīng)用模板 創(chuàng)建自定義應(yīng)用程序結(jié)構(gòu) 控制臺命令 核心驗(yàn)證器(Core Validators) 國際化 收發(fā)郵件 性能優(yōu)化 共享主機(jī)環(huán)境 模板引擎 集成第三方代碼 小部件 Bootstrap 小部件 Jquery UI 助手類 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
characters

Sessions 和 Cookies

Sessions 和 Cookies

[譯注:Session中文翻譯為會話,Cookie有些翻譯成小甜餅,不貼切,兩個單詞保留英文] Sessions 和 cookies 允許數(shù)據(jù)在多次請求中保持, 在純PHP中,可以分別使用全局變量$_SESSION?和$_COOKIE?來訪問,Yii將session和cookie封裝成對象并增加一些功能, 可通過面向?qū)ο蠓绞皆L問它們。

Sessions

和?請求?和?響應(yīng)類似, 默認(rèn)可通過為yii\web\Session 實(shí)例的session?應(yīng)用組件?來訪問sessions。

開啟和關(guān)閉 Sessions

可使用以下代碼來開啟和關(guān)閉session。

$session = Yii::$app->session;

// 檢查session是否開啟 if ($session->isActive) ...

// 開啟session$session->open();

// 關(guān)閉session$session->close();

// 銷毀session中所有已注冊的數(shù)據(jù)$session->destroy();

多次調(diào)用yii\web\Session::open() 和yii\web\Session::close() 方法并不會產(chǎn)生錯誤, 因?yàn)榉椒▋?nèi)部會先檢查session是否已經(jīng)開啟。

訪問Session數(shù)據(jù)

To access the data stored in session, you can do the following: 可使用如下方式訪問session中的數(shù)據(jù):

$session = Yii::$app->session;

// 獲取session中的變量值,以下用法是相同的:$language = $session->get('language');
$language = $session['language'];
$language = isset($_SESSION['language']) ? $_SESSION['language'] : null;

// 設(shè)置一個session變量,以下用法是相同的:$session->set('language', 'en-US');
$session['language'] = 'en-US';
$_SESSION['language'] = 'en-US';

// 刪除一個session變量,以下用法是相同的:$session->remove('language');
unset($session['language']);
unset($_SESSION['language']);

// 檢查session變量是否已存在,以下用法是相同的:if ($session->has('language')) ...
if (isset($session['language'])) ...
if (isset($_SESSION['language'])) ...

// 遍歷所有session變量,以下用法是相同的:foreach ($session as $name => $value) ...
foreach ($_SESSION as $name => $value) ...

補(bǔ)充: 當(dāng)使用session組件訪問session數(shù)據(jù)時候,如果session沒有開啟會自動開啟, 這和通過$_SESSION不同,$_SESSION要求先執(zhí)行session_start()。

當(dāng)session數(shù)據(jù)為數(shù)組時,session組件會限制你直接修改數(shù)據(jù)中的單元項(xiàng),例如:

$session = Yii::$app->session;

// 如下代碼不會生效$session['captcha']['number'] = 5;
$session['captcha']['lifetime'] = 3600;

// 如下代碼會生效:$session['captcha'] = [
    'number' => 5,
    'lifetime' => 3600,
];

// 如下代碼也會生效:echo $session['captcha']['lifetime'];

可使用以下任意一個變通方法來解決這個問題:

$session = Yii::$app->session;

// 直接使用$_SESSION (確保Yii::$app->session->open() 已經(jīng)調(diào)用)$_SESSION['captcha']['number'] = 5;
$_SESSION['captcha']['lifetime'] = 3600;

// 先獲取session數(shù)據(jù)到一個數(shù)組,修改數(shù)組的值,然后保存數(shù)組到session中$captcha = $session['captcha'];
$captcha['number'] = 5;
$captcha['lifetime'] = 3600;
$session['captcha'] = $captcha;

// 使用ArrayObject 數(shù)組對象代替數(shù)組$session['captcha'] = new \ArrayObject;
...
$session['captcha']['number'] = 5;
$session['captcha']['lifetime'] = 3600;

// 使用帶通用前綴的鍵來存儲數(shù)組$session['captcha.number'] = 5;
$session['captcha.lifetime'] = 3600;

為更好的性能和可讀性,推薦最后一種方案,也就是不用存儲session變量為數(shù)組, 而是將每個數(shù)組項(xiàng)變成有相同鍵前綴的session變量。

自定義Session存儲

yii\web\Session 類默認(rèn)存儲session數(shù)據(jù)為文件到服務(wù)器上,Yii提供以下session類實(shí)現(xiàn)不同的session存儲方式:

  • yii\web\DbSession: 存儲session數(shù)據(jù)在數(shù)據(jù)表中
  • yii\web\CacheSession: 存儲session數(shù)據(jù)到緩存中,緩存和配置中的緩存組件相關(guān)
  • yii\redis\Session: 存儲session數(shù)據(jù)到以redis?作為存儲媒介中
  • yii\mongodb\Session: 存儲session數(shù)據(jù)到MongoDB.

所有這些session類支持相同的API方法集,因此,切換到不同的session存儲介質(zhì)不需要修改項(xiàng)目使用session的代碼。

注意: 如果通過$_SESSION訪問使用自定義存儲介質(zhì)的session,需要確保session已經(jīng)用yii\web\Session::open() 開啟, 這是因?yàn)樵谠摲椒ㄖ凶宰远xsession存儲處理器。

學(xué)習(xí)如何配置和使用這些組件類請參考它們的API文檔,如下為一個示例 顯示如何在應(yīng)用配置中配置yii\web\DbSession將數(shù)據(jù)表作為session存儲介質(zhì)。

return [
    'components' => [
        'session' => [
            'class' => 'yii\web\DbSession',
            // 'db' => 'mydb',  // 數(shù)據(jù)庫連接的應(yīng)用組件ID,默認(rèn)為'db'.
            // 'sessionTable' => 'my_session', // session 數(shù)據(jù)表名,默認(rèn)為'session'.
        ],
    ],
];

也需要創(chuàng)建如下數(shù)據(jù)庫表來存儲session數(shù)據(jù):

CREATE TABLE session
(
    id CHAR(40) NOT NULL PRIMARY KEY,
    expire INTEGER,
    data BLOB
)

其中'BLOB' 對應(yīng)你選擇的數(shù)據(jù)庫管理系統(tǒng)的BLOB-type類型,以下一些常用數(shù)據(jù)庫管理系統(tǒng)的BLOB類型:

  • MySQL: LONGBLOB
  • PostgreSQL: BYTEA
  • MSSQL: BLOB

注意: 根據(jù)php.ini 設(shè)置的?session.hash_function,你需要調(diào)整id列的長度, 例如,如果?session.hash_function=sha256?,應(yīng)使用長度為64而不是40的char類型。

Flash 數(shù)據(jù)

Flash數(shù)據(jù)是一種特別的session數(shù)據(jù),它一旦在某個請求中設(shè)置后,只會在下次請求中有效,然后該數(shù)據(jù)就會自動被刪除。 常用于實(shí)現(xiàn)只需顯示給終端用戶一次的信息,如用戶提交一個表單后顯示確認(rèn)信息。

可通過session應(yīng)用組件設(shè)置或訪問session,例如:

$session = Yii::$app->session;

// 請求 #1// 設(shè)置一個名為"postDeleted" flash 信息$session->setFlash('postDeleted', 'You have successfully deleted your post.');

// 請求 #2// 顯示名為"postDeleted" flash 信息echo $session->getFlash('postDeleted');

// 請求 #3// $result 為 false,因?yàn)閒lash信息已被自動刪除$result = $session->hasFlash('postDeleted');

和普通session數(shù)據(jù)類似,可將任意數(shù)據(jù)存儲為flash數(shù)據(jù)。

當(dāng)調(diào)用yii\web\Session::setFlash()時, 會自動覆蓋相同名的已存在的任何數(shù)據(jù), 為將數(shù)據(jù)追加到已存在的相同名flash中,可改為調(diào)用yii\web\Session::addFlash()。 例如:

$session = Yii::$app->session;

// 請求 #1// 在名稱為"alerts"的flash信息增加數(shù)據(jù)$session->addFlash('alerts', 'You have successfully deleted your post.');
$session->addFlash('alerts', 'You have successfully added a new friend.');
$session->addFlash('alerts', 'You are promoted.');

// 請求 #2// $alerts 為名為'alerts'的flash信息,為數(shù)組格式$alerts = $session->getFlash('alerts');

注意: 不要在相同名稱的flash數(shù)據(jù)中使用yii\web\Session::setFlash() 的同時也使用yii\web\Session::addFlash(), 因?yàn)楹笠粋€防范會自動將flash信息轉(zhuǎn)換為數(shù)組以使新的flash數(shù)據(jù)可追加進(jìn)來,因此, 當(dāng)你調(diào)用yii\web\Session::getFlash()時,會發(fā)現(xiàn)有時獲取到一個數(shù)組,有時獲取到一個字符串, 取決于你調(diào)用這兩個方法的順序。

Cookies

Yii使用 yii\web\Cookie對象來代表每個cookie,yii\web\Request 和 yii\web\Response 通過名為'cookies'的屬性維護(hù)一個cookie集合,前者的cookie 集合代表請求提交的cookies, 后者的cookie集合表示發(fā)送給用戶的cookies。

讀取 Cookies

當(dāng)前請求的cookie信息可通過如下代碼獲取:

// 從 "request"組件中獲取cookie集合(yii\web\CookieCollection)$cookies = Yii::$app->request->cookies;

// 獲取名為 "language" cookie 的值,如果不存在,返回默認(rèn)值"en"$language = $cookies->getValue('language', 'en');

// 另一種方式獲取名為 "language" cookie 的值if (($cookie = $cookies->get('language')) !== null) {
    $language = $cookie->value;
}

// 可將 $cookies當(dāng)作數(shù)組使用if (isset($cookies['language'])) {
    $language = $cookies['language']->value;
}

// 判斷是否存在名為"language" 的 cookieif ($cookies->has('language')) ...
if (isset($cookies['language'])) ...

發(fā)送 Cookies

You can send cookies to end users using the following code: 可使用如下代碼發(fā)送cookie到終端用戶:

// 從"response"組件中獲取cookie 集合(yii\web\CookieCollection)$cookies = Yii::$app->response->cookies;

// 在要發(fā)送的響應(yīng)中添加一個新的cookie$cookies->add(new \yii\web\Cookie([
    'name' => 'language',
    'value' => 'zh-CN',
]));

// 刪除一個cookie$cookies->remove('language');
// 等同于以下刪除代碼unset($cookies['language']);

除了上述例子定義的 yii\web\Cookie::name 和 yii\web\Cookie::value 屬性 yii\web\Cookie 類也定義了其他屬性來實(shí)現(xiàn)cookie的各種信息,如 yii\web\Cookie::domain, yii\web\Cookie::expire 可配置這些屬性到cookie中并添加到響應(yīng)的cookie集合中。

注意: 為安全起見yii\web\Cookie::httpOnly 被設(shè)置為true,這可減少客戶端腳本訪問受保護(hù)cookie(如果瀏覽器支持)的風(fēng)險(xiǎn), 更多詳情可閱讀?httpOnly wiki article?for more details.

Cookie驗(yàn)證

在上兩節(jié)中,當(dāng)通過request?和?response?組件讀取和發(fā)送cookie時,你會喜歡擴(kuò)展的cookie驗(yàn)證的保障安全功能,它能 使cookie不被客戶端修改。該功能通過給每個cookie簽發(fā)一個哈希字符串來告知服務(wù)端cookie是否在客戶端被修改, 如果被修改,通過request組件的yii\web\Request::cookiescookie集合訪問不到該cookie。

注意: Cookie驗(yàn)證只保護(hù)cookie值被修改,如果一個cookie驗(yàn)證失敗,仍然可以通過$_COOKIE來訪問該cookie, 因?yàn)檫@是第三方庫對未通過cookie驗(yàn)證自定義的操作方式。

Cookie驗(yàn)證默認(rèn)啟用,可以設(shè)置yii\web\Request::enableCookieValidation屬性為false來禁用它,盡管如此,我們強(qiáng)烈建議啟用它。

注意: 直接通過$_COOKIE?和?setcookie()?讀取和發(fā)送的Cookie不會被驗(yàn)證。

當(dāng)使用cookie驗(yàn)證,必須指定yii\web\Request::cookieValidationKey,它是用來生成s上述的哈希值, 可通過在應(yīng)用配置中配置request組件。

return [
    'components' => [
        'request' => [
            'cookieValidationKey' => 'fill in a secret key here',
        ],
    ],
];
補(bǔ)充: yii\web\Request::cookieValidationKey 對你的應(yīng)用安全很重要, 應(yīng)只被你信任的人知曉,請不要將它放入版本控制中。
Previous article: Next article: