Laravel 之 Cookie 使用

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。數組

獲取 Cookie

Laravel 給咱們提供了靈活的獲取 Cookie 的方式,具體喜歡哪種按我的喜愛來吧~瀏覽器

  1. 經過調用 Illuminate\Http\Request 實例對象的 cookie 方法獲取
$value = $request->cookie('key');
$value = request()->cookie('key');
複製代碼
  1. 經過 Cookie Facade 方式
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

咱們在須要設置 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 是保存在客戶端的,因此刪除的操做其實服務端是沒權限去作的,那麼這裏所謂刪除其實就是使 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

不少時候 Cookie 是須要被前端童鞋使用的,可是默認狀況下 Laravel 在響應頭中添加的 Cookie 信息是加密過的,相似 eyJpdiI6IjRwOFMyTkl2aGs2TGt4OUcxYXRNXC9BPT0iLCJ2YWx1ZSI6IkpHN0Fqb0ZSaDFxVHE0OHdFRXdXMHc9PSIsIm1hYyI6Ijc2MTljZDVmZDI1Mjg5MTk3NTBlZGM0MzUxMjUyZjQ5MzcxOGE1MWU4Y2ViZTBlYTY5YWRjZjNkZjUwNzNkMDEifQ%3D%3D ,這種時候就得將那些須要 明文 傳輸的 Cookie 加入到 白名單 中去:

/app/Http/Middleware/EncryptCookies.php 中的 $except 數組中將其加入,

protected $except = [
    'key'
];
複製代碼

小結

其實 Laravel 的 Cookie 還有很多好用的方法,好比 Cookie::has('key') 判斷在請求頭中是否存在某個 Cookie。多去看看框架源碼,驚喜彩蛋 🍬 老是讓你那麼開心 🤩!

相關文章
相關標籤/搜索