問題: Cake2でのセッション情報がCake3以降でクリアされてしまう
余談として、Cakephp2からCakephp3以降のアップデートは破壊的な変更が多く行われているため、安易にアップデートすることができません。
小規模なWEBアプリケーションであれば、根っから作り直してしまうという方法が手っ取り早いかと思います。
ただ、中規模以降になると、やはりモデルベースから少しずつ以降していくことが必要になってきます。
ある日、フォーム画面の移行をしていたのですが、AJAXで一旦POSTリクエスト(Cakephp4側)をかまして、フォーム確認画面(Cakephp2側)に遷移しようとすると、セッションが切れてしまい、フォーム初期画面にリダイレクトされてしまう、といった現象に沼っていました。
解決法: useForwardsCompatibleTimeout => true を設定する
解決は意外に簡単。(ありがたやー)
Cakephp2側 app/Config/core.php
の Session の 設定内にて 'useForwardsCompatibleTimeout' => true,
を追加だけ。
■ app/Config/core.php
// useForwardsCompatibleTimeoutのtrueを設定 ※他の設定値はただの例。自身の環境に合わせてください。 Configure::write('Session', array( 'defaults' => 'php', 'cookieTimeout' => 0, 'cookie' => 'hoge', 'useForwardsCompatibleTimeout' => true, ));
詳細な原因
CakeSession::_checkValid()
で正当なセッションがあればそれを使い、なければ destroy()
されてしまいますが、不当判定されてしまう原因が static::$_useForwardsCompatibleTimeout が false (デフォ値)なために time 調整されず、バージョン3以降のCakeとの互換性が維持されなかった。という状況だった模様デス。