Laravel 9 のCache・Session・Cookieについて
はじめに
私の様に沼にはまってしまった方の為に、ほんの少しでも参考になればと思いアウトプットします。
私はいつも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');
を使う方法があったり、公式サイトにはもっと詳しく載っているかと思いますので、是非公式サイトもご参考ください。
また、デフォルトではSession
やCookie
をDevToolで見ると暗号化されている為、値に何が入っているか分かりません。
そんな時は、App\Http\Middleware\EncryptCookies.php
の中にあるprotected $except = ['cookie_name', '***']
として記載する事で値が暗号化されずに見れる様になります。
Laravel 公式サイト
Discussion