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_rewritehttp://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();


あー、しんどかったー