SessionのAutoStartをOffにして、手動でセッション管理
cakeのcore.phpでは、下記のように標準でセッションのスタートが自動的にONになってます。
Configure::write('Session.start', true);
ただ、このAuto Startを使うと、Cookieの発行も自動的にされ、Cookieにセットするパスの値が、CakeのROOTディレクトリになってしまいます。
例えば、public_html/cake/app/webrootみたいな構成になっていると、Cookieのパスには/cakeがセットされます。
この場合、パスを/にしてcake以外のアプリでもCookieを共有したいとか、そういった場合に対応できません。今回、既存のURLを踏襲するという要件をクリアするために、私はmod_rewriteでhttp://hoge.com/hoge/index.htmlにアクセスすると、リダイレクトせずに/cake/hoge/indexが呼び出されるようにしていました。
そうすると、cakeで発行するセッションIDのCookieのパスは/cakeなのですが、ブラウザは/hoge/index.htmlにアクセスしていることになるので、Cookieがブラウザから送信されません。(このせいでセッションIDが毎回変わってしまう問題に突き当たり、原因を特定するのに時間を費やしてしまったorz )
ということで、$this->Session->path = '/' みたいにすればいけるかなと思ったのですが、これはダメでした。というか、コントローラで利用するセッションコンポーネントを使って、パスを自由にコントロールする手段が分からなかった。
ということで、セッションコンポーネント(/cake/libs/controller/components/session.php)が継承しているCakeSessionクラス(/cake/libs/session.php)を直接呼び出して対応しました。
まずは、core.phpのsession.startをfalseにします。
Configure::write('Session.start', false);
コントローラで、下記のように呼び出すだけです。
uses('Session'); $session = new CakeSession('/'); $session->start(); $session->write('formPost', '1');
画面が変わってからセッションをリードする場合は、
uses('Session'); $session = new CakeSession('/'); $session->start(); $hoge = $session->read('formPost');
とするだけ。
セッションのあるキーを消したい場合は、delメソッドを使います。(deleteは存在しないので)
uses('Session'); $session = new CakeSession('/'); $session->start(); $hoge = $session->del('formPost');
セッションを破棄する場合は、destroyを使います。
uses('Session'); $session = new CakeSession('/'); $session->start(); $hoge = $session->destroy();
あー、しんどかったー