以 Yii 2.0 基础版为例来介绍 Yii 中是如何处理 cookie 的,高级版类似。
Yii 2.0 中对 cookie 进行了封装,类文件为
/basic/vendor/yiisoft/yii2/web 目录下的 Cookie.php 和
CookieCollection.php
,一般我们会在此基础上对 cookie
进行二次封装。
在自定义组件目录 /basic/components 下新建一个类文件 CookieHelper.php,来对 cookie 进行二次封装,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 |
<?php
namespace
app\components
;
use
yii\web\Cookie
;
class
CookieHelper
{
/**
* 写入数据(新增或者更新)
*/
public
static
function
set
(
$key
,
$value
,
$expire
=
0
)
{
$cookie
=
new
Cookie
();
$cookie
->
name
=
$key
;
// cookie的名称
$cookie
->
value
=
$value
;
// cookie的值
if
(
$expire
)
{
$cookie
->
expire
=
time
()
+
$expire
;
// cookie的有效期,默认直到浏览器会话关闭
}
else
{
$cookie
->
expire
=
0
;
}
// 响应给浏览器客户端(写入cookie)
\Yii
::
$app
->
response
->
cookies
->
add
(
$cookie
);
}
/**
* 获取数据(返回的是一个对象)
*/
public
static
function
get
(
$key
)
{
// 从浏览器客户端请求cookie(读取cookie)
return
\Yii
::
$app
->
request
->
cookies
->
get
(
$key
);
}
/**
* 获取数据(返回具体的值)
*/
public
static
function
getValue
(
$key
,
$defaultValue
=
NULL
)
{
// 从浏览器客户端请求cookie(读取cookie)
return
\Yii
::
$app
->
request
->
cookies
->
getValue
(
$key
,
$defaultValue
);
}
/**
* 删除数据(删除单个cookie)
*/
public
static
function
del
(
$key
)
{
\Yii
::
$app
->
response
->
cookies
->
remove
(
$key
);
}
/**
* (注意:该方法并不能删除客户端中的cookie)
* 撤消当前连接中对 cookie 的所有更改,即让客户端的cookie保持不变。
*/
public
static
function
cancelAll
()
{
\Yii
::
$app
->
response
->
cookies
->
removeAll
();
}
}
|
然后,
在控制器层,新增一个控制器 CookieController.php,用于测试,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 |
<?php
namespace
app\controllers
;
use
yii\web\Controller
;
use
app\components\CookieHelper
;
class
CookieController
extends
Controller
{
public
function
actionIndex
()
{
CookieHelper
::
set
(
'username'
,
'xiaoming'
,
60
*
30
);
// 写入cookie
}
public
function
actionGet
()
{
$usernameObj
=
CookieHelper
::
get
(
'username'
);
$username
=
CookieHelper
::
getValue
(
'username'
);
// 获取指定cookie的值
var_dump
(
$usernameObj
,
'<hr>'
,
$username
);
}
public
function
actionDel
()
{
CookieHelper
::
del
(
'username'
);
// 删除指定的cookie
// CookieHelper::cancelAll(); // 撤消前面的代码对cookie的所有操作
}
}
|
在浏览器地址栏输入下面的地址,进行测试:
http://basic.com/cookie/index
http://basic.com/cookie/get
http://basic.com/cookie/del
说明:
\Yii::$app->response 和
\Yii::$app->request 下的 cookies 都是 CookieCollection 对象。区别在于:
\Yii::$app->response 下的 CookieCollection 对象 的 readOnly 属性的值为 false,该对象用于写操作。
\Yii::$app->request 下的 CookieCollection 对象 的 readOnly 属性的值为 true,该对象用于读操作。