SessionのAutoStartをOffにして、手動でセッション管理 (セッションコンポーネント編)
環境は、Cake1.2RC3です。
昨日の記事で、CakeSessionクラスを使って、セッションで発行されるCookieパスをコントロールすると書きましたが、セッションコンポーネントで出来ました。
http://d.hatena.ne.jp/cakephper/20081010
CakeSessionクラスをそのままnewして利用してたのですが、携帯用にセッションIDを手動で与えて、$session->id($sid)みたいにしてたら、なぜだかread()だけ出来なかった(writeはできてるし、sessionIDも正常にセットされてるのに)
ということで、cake/libs/session.phpやcake/libs/controller/components/session.phpのソースを追っていたら、やはりセッションコンポーネントでなんとかなりそうだと気づいたので、そっちで対応しました。
セッションコンポーネントは、コントローラで
var $components = array('Session');
とすれば使えますし、cake1.2では標準で読み込んでるので上記の記述も不要です。
セッションコンポーネントを手動で利用する場合は、activate()とstartup()メソッドを利用します。
まずは、core.phpのsession.startをfalseにします。
Configure::write('Session.start', false);
コントローラや、app_controllerなどで、下記のようにして利用します。
まずは、最初にセッションIDの生成と、セッションに情報の書き込み。activateの引数に、Cookieでセットされるパスの情報を欠きます。startupでは、コントローラのポインタを渡す必要があるため、$thisを入れています。あとは普段のセッションを同じように記載できます。セッションIDを取得する場合は、id()メソッドを使います。id()メソッドの引数に任意のセッションIDを指定することも可能です。
function setSession(){ $this->Session->activate('/'); $this->Session->startup($this); $this->Session->write('hoge', '1'); return $this->Session->id(); }
一度生成したセッションから、セッションIDを得る場合は、id()で取得できるのですが、その手前で1度readやwriteをしておかないとセッションIDが返って来ませんので注意が必要です。
function getSessionID(){ $this->Session->activate('/'); $this->Session->startup($this); $this->Session->read('hoge'); return $this->Session->id(); }
モバイルなどで、リンクやPostのformタグにセッションIDを下記のようにセットすれば、PCの場合はCookieで、携帯の場合はリンク情報からセッションを利用できます。
コントローラにて下記のようにする $this->Session->activate('/'); $this->Session->startup($this); $this->Session->read('hoge'); $this->set('sessionid', $this->Session->id() ); ビューで下記のようにする <?php echo $form->create('MobileHoge', array( 'url' => '/mobile/hoge.php?CAKESESSION='.$sessionid ) );?>
CAKESESSIONの値は、下記のようにcore.phpで指定したセッションIDの名前になります。
Configure::write('Session.cookie', 'CAKESESSION');