Laravel 的 Cookie 用起来蛮优雅的,但仍是踩了很多坑,主要是不熟悉框架所致 😁。其实本质仍是在使用全局变量 $_COOKIE
,因为原生的使用方式不够友好,所以既然选择了框架,就充分利用其提供的友好封装层。php
先来一个最简单的示例:前端
public function setCookie() {
return response('Hello Cookie')->cookie('test', '123', 60);
}
public function getCookie() {
echo request()->cookie('test');
}
复制代码
首先咱们要明确 Cookie 是存储在浏览器端的(也就是用户端),因此它就必须依附于具体某个请求和响应。而 Session 是存储在服务端的,它不须要依附在某个请求或者响应头中。bootstrap
因此咱们在使用 Cookie 的时候,就必须配合 Request 和 Response。数组
Laravel 给咱们提供了灵活的获取 Cookie 的方式,具体喜欢哪种按我的喜爱来吧~浏览器
Illuminate\Http\Request
实例对象的 cookie
方法获取$value = $request->cookie('key');
$value = request()->cookie('key');
复制代码
use Illuminate\Support\Facades\Cookie;
// ...
$value = Cookie::get('key');
复制代码
其实第二种方式获取 Cookie 值也是经过第一种方式调用的,咱们能够在 Illuminate\Support\Facades\Cookie
类中的 get()
方法中看到:bash
public static function get($key = null, $default = null) {
return static::$app['request']->cookie($key, $default);
}
复制代码
咱们在须要设置 Cookie 的请求方法中,经过 Response 的 cookie()
方法进行设置:cookie
$value = response('Hello Cookie')->cookie('key', 'value', 60);
$value = response('Hello Cookie')->withCookie('key', 'value', 60);
复制代码
上面两种方式都可,第一种方式其实就是调用了第二种方式(有时候选择多了反而增长记忆成本 😅)。app
还有一种使用 helper 函数。。。框架
function cookie($name = null, $value = null, $minutes = 0, $path = null, $domain = null, $secure = false, $httpOnly = true, $raw = false, $sameSite = null) {}
复制代码
推荐仍是使用第一种方式,由于能够正确的理解 Cookie 的设置方式。dom
开篇也说过 Cookie 是保存在客户端的,因此删除的操做其实服务端是没权限去作的,那么这里所谓删除其实就是使 Cookie 失效。Laravel 提供了友好的 API 供咱们调用,感谢 Laravel 🙏~
use Illuminate\Support\Facades\Cookie;
// ...
Cookie::forget('key');
复制代码
细心你会发现这个类中没有这个静态方法,和 Cookie::forever('key', 'value')
同样,这些好用的 API 是 Illuminate\Cookie\CookieJar
这个类提供的(这个类是经过 ServiceProvider 在 Illuminate\Foundation\Application
类中注册,而后在 /bootstrap/app.php
实例化,详细的读源码~)
public function forget($name, $path = null, $domain = null) {
return $this->make($name, null, -2628000, $path, $domain);
}
复制代码
咱们能够看到其实就是将 Cookie 的有效期(Expires/Max-Age)设置成过去时便可。
更细心的你会发现光是这一句并无什么卵用啊 🤣,别忘了咱们要把更改后的 Cookie 加入到响应头中,这样客户端才会修改 Cookie 值(说到这里其实本质仍是在设置 Cookie 而已 🤨)。
use Illuminate\Support\Facades\Cookie;
// ...
public function demo() {
$cookie = Cookie::forget('key');
return response('xxx')->cookie($cookie);
}
复制代码
不少时候 Cookie 是须要被前端童鞋使用的,可是默认状况下 Laravel 在响应头中添加的 Cookie 信息是加密过的,相似 eyJpdiI6IjRwOFMyTkl2aGs2TGt4OUcxYXRNXC9BPT0iLCJ2YWx1ZSI6IkpHN0Fqb0ZSaDFxVHE0OHdFRXdXMHc9PSIsIm1hYyI6Ijc2MTljZDVmZDI1Mjg5MTk3NTBlZGM0MzUxMjUyZjQ5MzcxOGE1MWU4Y2ViZTBlYTY5YWRjZjNkZjUwNzNkMDEifQ%3D%3D
,这种时候就得将那些须要 明文 传输的 Cookie 加入到 白名单 中去:
在 /app/Http/Middleware/EncryptCookies.php
中的 $except
数组中将其加入,
protected $except = [
'key'
];
复制代码
其实 Laravel 的 Cookie 还有很多好用的方法,好比 Cookie::has('key')
判断在请求头中是否存在某个 Cookie。多去看看框架源码,惊喜彩蛋 🍬 老是让你那么开心 🤩!