今更なに言ってるんだよ的なSessionのお話。
#事象
ある画面で作成したSessionの値が2画面先で参照できない。
よーは、特定のKeyがSessionから欠落します。
画面は
login→index→confirm
の3画面
Session作成:login画面でログインする(Sessionにa,bの値を設定している)
↓
Session更新:index画面に遷移してくるので、送信ボタンを押下する(Sessinのa,bを更新している) ←ここまでは存在する
↓
Session参照:confirm画面が表示される(Sessionのa,bの値を参照したいが存在しない)
Sessionの中にa,bがKeyごとないよ\(^o^)/
- Login→indexはOK
- index→confirmはNG
こんな状態
#原因
Login画面で設定した値(正確にはKey)が、次の画面までしか引き継がれない「old」の中に存在しているため、index画面からconfirm画面へ遷移した際に削除される。
(session()->all()の中身をddで出力)「old」ってやつにあるKeyが対象のようだ。
array:3 [▼
"_previous" => array:1 [▶]
"_flash" => array:2 [▼
"old" => array:2 [▼
0 => "a"
1 => "b"
]
"new" => []
]
"_token" => "xxxxxxxxxxxxx"
]
oldは元々、画面のFormで入力された内容がバリデーションチェックなどで引っかかり、画面に戻った際に以前に入力された内容を表示するためのものなので、持続しないわけですね。
多分、一定期間後にoldが消えるのでそれ以降であればなんら問題なくputされるのではないかなぁと推測。
#oldに入っているkeyと同じkeyの値を更新したい場合の解決策
- putの前にforgetで消して入れ直す場合
session()->forget('a');
- putした後にSessionの内容をまるまる入れ替える場合
session()->replace(session()->all());
- reflashする場合
$request->session()->reflash();
とりま3パターンあります。こんな感じで。
##追記
そもそもLaravelのSessionは、画面間で引き回すことを想定した作りじゃないんじゃないかと推測。
バリデートで引っかかった時に元の値を表示するためのものなのに画面間で引き継いでるのがおかしいんじゃないかと思いました。
でもKVS使うほどでもなく、なんだかなぁ。