このチュートリアルでは、セッションを使う方法についてご説明したいと思います。
こちらもさほど難しい話ではありませんので、実際のコードを見てみましょう。Step6で作成した「samples_base.inc」を下記のように修正してください。この手順を行うことによって、このsamples_baseクラスを継承したすべてのLogicでセッションを使うことができるようになります。
<?php
require_once( 'Smarty.class.php' );
require_once( RISOLUTO_FUNC . 'risoluto_conf.php' );
require_once( RISOLUTO_FUNC . 'risoluto_log.php' );
require_once( RISOLUTO_FUNC . 'risoluto_session.php' );
abstract class samples_base
{
protected $smarty;
protected $obj_conf;
protected $obj_log;
protected $obj_sess;
abstract function model();
abstract function view();
public function __construct()
{
}
public function __clone()
{
}
public function init()
{
$this->obj_conf = new RisolutoConf();
$this->obj_conf->parse( RISOLUTO_CONF . 'risoluto.ini' );
$this->obj_log = RisolutoLog::singleton();
$this->obj_sess = RisolutoSession::singleton();
$this->smarty = new Smarty;
$this->smarty->template_dir = RISOLUTO_USERLAND . $this->obj_sess->sessLoad( 'currentcage' );
$this->smarty->config_dir = RISOLUTO_USERLAND . $this->obj_sess->sessLoad( 'currentcage' );
$this->smarty->compile_dir = RISOLUTO_CACHE;
$this->smarty->cache_dir = RISOLUTO_CACHE;
$this->smarty->caching = false;
$this->smarty->debugging = false;
$this->smarty->force_compile = true;
$this->smarty->compile_check = true;
}
public function errHandler()
{
}
public function clean()
{
unset( $this->smarty );
unset( $this->obj_conf );
unset( $this->obj_log );
unset( $this->obj_sess );
}
}
?>
追加したものについて、簡単にご説明したいとおもいます。
まず、「require_once( RISOLUTO_FUNC . 'risoluto_session.php' );」が追加されました。Risolutoが標準で用意しているセッション操作用クラスを読み込みます。
「protected $obj_sess;」という1行も追加されています。これはセッション操作用クラスのインスタンスを保持するためのクラス変数です。名称は任意ですが慣例としてこの名称にしておくことが推奨されています。
「$this->obj_sess = RisolutoSession::singleton();」がinit()メソッドに追加されていることにお気づきでしょうか。ここでクラスインスタンスの生成を行っています。
clean()メソッドに「unset( $this->obj_sess );」が追加されているのも確認いただけるかと思います。
これらを各Logicに組み込んでも構いません*1が、一般にBaseに記述する方がよいでしょう。
この例には、ちょっとしたTipsが含まれています。init()メソッドの「$this->smarty->template_dir」と「$this->smarty->config_dir」の値をセットする際、Step6までは「RISOLUTO_USERLAND . 'samples'」と記述していました。それでもいいのですが、Cage名が変わる可能性がある場合などはいちいち書き換えるのが面倒です*2。そんなとき、この例のように「RISOLUTO_USERLAND . $this->obj_sess->sessLoad( 'currentcage' )」と書くことで、Cage(ディレクトリ)名を気軽に変更することが可能になります。
それでは、Logicの方の処理を見てみましょう。下記のコードを「sample07.php」として保存してください。
<?php
require_once( 'samples_base.inc' );
class sample07 extends samples_base
{
public function model()
{
if ( ! $this->obj_sess->sessIsThere( $this->obj_sess->sessLoad( 'currentcage' ) ) )
{
$this->obj_sess->sessStore( $this->obj_sess->sessLoad( 'currentcage' ), '1');
}
else
{
$tmp_sessVal = $this->obj_sess->sessLoad( $this->obj_sess->sessLoad( 'currentcage' ) );
$this->obj_sess->sessStore( $this->obj_sess->sessLoad( 'currentcage' ), $tmp_sessVal + 1 );
}
}
public function view()
{
$this->smarty->assign ( 'sessVal', $this->obj_sess->sessLoad( $this->obj_sess->sessLoad( 'currentcage' ) ) );
$this->smarty->display( 'sample07.tpl' );
}
}
?>
「$this->obj_sess->sessIsThere(~)」は、引数で指定した名称のセッション変数が存在するかどうかを判定するメソッドです。この例では、セッションが存在するかどうかで処理を分けるために使っています。
「$this->obj_sess->sessLoad(~)」は、引数で指定した名称のセッション変数にセットされた値を取得するメソッドです。この例では、Risolutoのコントローラがセットしているセッション変数の値を取得しています。詳細はコントローラがセットするセッション一覧を参照してください。
「$this->obj_sess->sessStore(~)」は、第1引数で指定した名称のセッション変数に、第2引数で指定した値を格納するメソッドです。
この例では使用していませんが、引数で指定した名称のセッション変数を削除する「$this->obj_sess->sessRevoke(~)」というメソッドなどもあります。
通常セッションの開始はコントローラが行いますので、各Logicで「$this->obj_sess->sessStart()」(セッションを開始するメソッド)や「$this->obj_sess->sessEnd()」(セッションを終了するメソッド)を呼び出す必要はありません*3。
Design側のコードもここで提示させていただきます。下記のコードを「sample07.tpl」として保存してください。
<HTML>
<HEAD>
<TITLE>sample07</TITLE>
</HEAD>
<BODY>
貴方は、{$sessVal}回このページを表示しました。
</BODY>
</HTML>
これらのファイルをアップロードし、最初の画面にWebブラウザからアクセスすると、アクセスするたびに数字がカウントアップされるはずです。
このように、簡単にセッションを取り扱うことが可能です。セッション操作用クラスについて詳しく知りたい場合は、RisolutoSessionクラス(risoluto_session.php)を参照してください。
通常、セッション変数名をどうするかは、ここのプロジェクトごとに規約を作成し、それに準拠するのが望ましいといえます。しかしながら、これから新規に開始するプロジェクトであったり、個人的なプロジェクトの場合はそのような規約自体が存在しないことも多々あります。
そのような場合のために、下記に簡単な指針をご用意いたしました。すべての場合において適用できるわけではありませんが、皆様の参考になれば幸いです。
セッション中の「currentcage」をセッション変数名にすると良いでしょう。
$name = $this->obj_sess->sessLoad( 'currentcage' );
$this->obj_sess->sessStore($name, '1');
値を読み取る側では、同一の方法でセッション変数名を作成することで値を取得することができます。
$name = $this->obj_sess->sessLoad( 'currentcage' );
$tmpVal = $this->obj_sess->sessStore($name);
同一Cage内ではなく異なるCage間で値を受け渡す場合で、画面遷移が一定である(不特定多数との値受け渡しが発生しない)場合もこのルールを適用するとよいかもしれません。
コントローラがセットするセッション一覧に列挙されているセッション変数のように、同一Risolutoシステム内でグローバル変数のようにセッションを使う場合は、事前の設計が必要不可欠です。
基本的にどのような名称でも構いませんが、定数やコンフィグファイルなどに名称を定義しておくなど、管理しやすくかつ重複しない(したときにすぐ見つけられる)ような仕組みを考えておくべきです。
また、不特定多数のCage間で値を受け渡しする場合もこのルールを適用すると良いでしょう。