環境
Laravel5.8
Redis (aws elasticache)
実現しようとしていること
ECサイトで買い物カゴ情報をRedisで管理。
商品追加ボタンでRedisにjsonで情報を追加 → 商品カゴページでその情報を表示したい
現状
▼商品追加ボタン押下後のadd function(CartController)
public function add(Request $request) { //商品情報をjson形式にし、$cartJsonに入れる(省略) Session::put('cart', $cartJson); Session::save(); echo Session::get('cart');//このようにsave()の直後にgetはできる(echoで表示される) }
▼買い物カゴ一覧ページ(CartController)
public function list() { $cart = json_encode(json_decode(Session::get('cart'))); Session::all() //**[]が返る return $cart;//Nullが返る }
なぜ買い物カゴ一覧ページに移動するとSessionの値が取れないのかが不明で、解決できないのでこちらにて質問させていただきました。
他ファイルの情報が必要な場合追記していこうと思いますので、遠慮なくお申し付けくださいませ。
追記(テストページをrouteに作成してみた結果)
下記のようにrouteを設定し (url)/session-page-testを見ると、正常に「longtime」と表示されている + redisにも登録されている
Route::get('session-page-test', function () { session(['test' => 'longtime']); return session('test'); });
しかしCartController内ではsession helperが全く動作しない(Redisに登録もされない)
$cartJsonはどういう内容を保持しているのでしょうか。
>echo Session::get('cart');
何が出るのでしょうか
>$cart = json_encode(json_decode(Session::get('cart')));
なぜわざわざdecodeのあとにencodeするのでしょうか。
素直に考えたら session_start() 出してないんじゃないの?
session_start()しても結果は変わりませんね。。
フレームワークでsession_startを自前で書くことはないですよ
念のために書くと… session_start() を出している「なにか」がうまく使えてないんじゃないの? って意味です。
確かLaravelはPHPのsession_start()の機能を使わない自前のセッションを実装していたはずですよ。
https://qiita.com/qiuyin/items/d31b58aa014af8221f53
session_start使ったらそもそもredisに保存とかじゃなくてfileで保存されちゃうしね・・・
あとsession_startしなくてセッション使ったらwarnとかでないっけ。
念の為確認ですが、storage/framework/sessions/以下にセッションファイルが作成されている、という事もないですよね?(filedriverになっている)
あと背景的にはEB環境でセッションの共有が必要になった、みたいな感じでいいですか?
(その場合filedriverでAPインスタンスを跨いだ場合セッションが消える)