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
]

という感じだった

考察

現在のところは原因が分かってないが、

_flashold に入ってると、処理終了時(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はここ

github.com

この 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();
    }
}

で、実処理はこれ

github.com

考察は間違っていなかったようだった。