Laravelのセッションが消えて困った
概要
画面間で遷移させているときに、一部のセッションキーが消えてしまったときの話 (Laravelのバージョンは5.3)
ざっくりと
(先に断っておくが、変数やメソッド名は仮)
少し雑だが、こんなformからPOSTで画面Aに遷移しようとする際に
<form action="https://abc.com/" method="post" name=""> <input type="input" name="client_id" value="hoge"><br> <input type="input" name="redirect_uri" value="https://yyy.com"><br> <input type="submit" value='BUTTON'> </form>
こんな形でセッションに突っ込んでたら、
/** * /に対応するControllerのAction */ public function index(Request $request) { session()->put('client_id', $request->input('client_id')); session()->put('redirect_uri', $request->input('redirect_uri')); return view('index'); }
以下のようにsessionからgetができなくて困った
/** * indexのviewからPOST送信先のControllerのAction */ public function add(Request $request) { session()->get('client_id'); // ←取得できずnullになる session()->get('redirect_uri'); // ←取得できずnullになる
調査内容
このように、view遷移前、POST送信直後のそれぞれに dd(session()->all());
を入れてみて、
セッションの構造がどうなっているかを調べた
dd(session()->all()); // 追加 return view('index'); } public function add(Request $request) { dd(session()->all()); // 追加
結果
return view直前での詳細
array:11 [▼ "_previous" => array:1 [▼ "url" => "http://******" ] "_flash" => array:2 [▼ "old" => [ "client_id" => "hoge", "redirect_uri" => "https://yyy.com", ] "new" => [] ] "_token" => "**************************" "client_id" => "hoge", "redirect_uri" => "https://yyy.com", "hoge" => "hoge", "fuga" => "fuga", "id" => 111111111, ]
function addでの詳細
array:11 [▼ "_previous" => array:1 [▼ "url" => "http://******" ] "_flash" => array:2 [▼ "old" => [] "new" => [] ] "_token" => "**************************" "hoge" => 'hoge' "fuga" => "fuga" "id" => 111111111 ]
という感じだった
考察
現在のところは原因が分かってないが、
_flash
の old
に入ってると、処理終了時(response返却後?)にセッションからそのキーを抹消するのでは?と思っている
(Illuminate\Session\Store.php
を読んだら、結果が分かりそう)
補足
たしかに以下のように reflash()
を追加したらセッションは維持された
/** * /に対応するControllerのAction */ public function index(Request $request) { session()->put('client_id', $request->input('client_id')); session()->put('redirect_uri', $request->input('redirect_uri')); $request->session()->reflash(); return view('index'); }
追記
LaravelのSessionはここ
この terminate
つまり、処理終了後にSessionが削除されていた。
/** * Perform any final actions for the request lifecycle. * * @param \Illuminate\Http\Request $request * @param \Symfony\Component\HttpFoundation\Response $response * @return void */ public function terminate($request, $response) { if ($this->sessionHandled && $this->sessionConfigured() && ! $this->usingCookieSessions()) { $this->manager->driver()->save(); } }
で、実処理はこれ
考察は間違っていなかったようだった。