Develop and Download Open Source Software

最近の更新

2012-04-05
2012-03-27

Wikiガイド

サイドバー

戻る

Step7:セッションを使ってみる

このチュートリアルを行う前に……

  • Risolutoのセットアップが終了している必要があります
  • これまでのチュートリアルを理解している必要があります

セッションを使ってみる(Base編)

このチュートリアルでは、セッションを使う方法についてご説明したいと思います。

こちらもさほど難しい話ではありませんので、実際のコードを見てみましょう。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->parseRISOLUTO_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編)

それでは、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 );
      }
    }

    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)を参照してください。

セッション変数名について

通常、セッション変数名をどうするかは、ここのプロジェクトごとに規約を作成し、それに準拠するのが望ましいといえます。しかしながら、これから新規に開始するプロジェクトであったり、個人的なプロジェクトの場合はそのような規約自体が存在しないことも多々あります。

そのような場合のために、下記に簡単な指針をご用意いたしました。すべての場合において適用できるわけではありませんが、皆様の参考になれば幸いです。

同一Cage内での値受け渡しのためにセッションを使う場合

セッション中の「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システム内で値を受け渡すためにセッションを使う場合(グローバル変数的にセッションを用いる場合)

コントローラがセットするセッション一覧に列挙されているセッション変数のように、同一Risolutoシステム内でグローバル変数のようにセッションを使う場合は、事前の設計が必要不可欠です。

基本的にどのような名称でも構いませんが、定数やコンフィグファイルなどに名称を定義しておくなど、管理しやすくかつ重複しない(したときにすぐ見つけられる)ような仕組みを考えておくべきです。

また、不特定多数のCage間で値を受け渡しする場合もこのルールを適用すると良いでしょう。

戻る


  1. *1例えば、model()メソッド内の適切な位置にこれらを記述すればOKです
  2. *2例えば、SimplePage Flavorなどは複数設置したいというニーズがあるかもしれませんが、このように書いておけば、対応も容易になります
  3. *3もちろん呼び出しても構いませんが、Risolutoがどのような処理を行っているかを理解するまではやめておいた方が無難です

SourceForge.JP is a Japanese version of SourceForge.net. For developments that are not related to Japan, we recommend you to use SourceForge.net.