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');