🌊

Laravel 9 のCache・Session・Cookieについて

2022/09/10に公開

はじめに

私の様に沼にはまってしまった方の為に、ほんの少しでも参考になればと思いアウトプットします。
私はいつもLaravelの公式サイトでGoogle翻訳を使いながら調べています。
CacheやSessionやCookieについては、仕事柄で何となくは理解しているつもりでした。

やりたい事

ログイン機能を使う事なく、ユーザー情報を保存する事ができる様にしたいと思っていました。
例:ユーザー名のフォームに入力したユーザー名をサイトを閉じた後でも再利用ができる

Cache(キャッシュ)

そこで、まず初めに試みたのはCacheでした。
コントローラーでuse Illuminate\Support\Facades\Cache;を追加して、下記のコマンドで保存や取得ができます。

保存:Cache::put('key', 'value');
取得:$value = Cache::get('key');
削除:Cache::forget('key');

いざCacheを使ってみると、PCから見た時とスマホから見た時と同じ情報が記憶されました。
そうです。自分が入力した情報が、他人と共有されていたのです。
起きた事象から推察するに、キャッシュはサーバに情報が保管されており、どの機器(PC・スマホ)から見ても同じ情報を参照しているのだと理解しました。

Session(セッション)

次に試したのがSessionです。
何故、Cookieにしなかったかと言うと、Cookieを記憶させるには利用者に許可を求める画面を用意しなければならないという事から、他の方法があればそっちを使いたいと考えていました。安易すぎます😄

Sessionを利用するには、下記のコマンドで保存や取得ができます。
特にコントローラーにファサードを追加したりする必要はありません。

保存:session(['key' => 'value'])
取得:$value = session('key');
削除:$request->session()->forget('name')

いざSessionを使ってみると、他の機器との共有はしなくなりましが、ブラウザを閉じると情報がクリアされてしまいました。
GoogleChromeのDevToolを使ってSessionの中を見てみると、ブラウザを起動する度に値が変わっていました。。。
起きた事象から推察するに、Sessionはローカルに保存される情報でブラウザを起動する度にクリアされるのかと理解しました。

Cookie(クッキー)

そして最後に試したのがCookieです。

Cookieを利用するには、コントローラーにuse Illuminate\Support\Facades\Cookie;を追加して、下記のコマンドで保存や取得が出来ます。

保存:Cookie::queue('name', 'value');
取得:$cookie = Cookie::get('key');
削除:Cookie::expire('name');

上記の方法でやってみると、無事に他の機器と共有する事なく、それぞれの機器で保存する事ができました。
しかし、喜んでいたのも束の間、暫く時間が経過すると情報がクリアされてしまいました。
また、ブラウザを閉じた時も情報がクリアされていました。Cookieの意味・・・。
某有名サイトの「占いの星座」や「天気の地域」を選択する時はCookieというモノを使って保存しているんじゃないの・・・😖

そこでCookieについて、更に調べてみるとCookie::forever('key')なるものを発見😃
長期間の保存が出来る様な事が書いてあったので、早速、下記の事を試してみました。

保存:Cookie::queue(Cookie::forver('name', 'value'));

すると、やりたい事が実現できました。
ただし、長期間と言っても1年間程度の様です。
期間を指定すればもう少し長く保存ができるかもしれませんが、そこはもう少し調べる必要がありそうですが次回という事で・・・😄

最後に

それぞれの保存や取得の方法は書いてある事が全てではありませんでした。
例えばCookieの取得は$value = $request->cookie('name');を使う方法があったり、公式サイトにはもっと詳しく載っているかと思いますので、是非公式サイトもご参考ください。

また、デフォルトではSessionCookieをDevToolで見ると暗号化されている為、値に何が入っているか分かりません。
そんな時は、App\Http\Middleware\EncryptCookies.phpの中にあるprotected $except = ['cookie_name', '***']として記載する事で値が暗号化されずに見れる様になります。

Laravel 公式サイト

https://laravel.com/

Discussion