Ethna セッション

あまりに忙しくて日記もMPCも更新出来ていない…

今日はちょっとフレームワークのお話。

Ethnaを使ってPC・携帯両対応のサイトを作ってたんですが、

セッションがどうもおかしい。

トリガーで以下の様に定義してるんですが、PCの場合でもなぜかHTTPベース(GET, POST)でセッションが扱えてしまう。

<?php
/* PC */
if ($carrier == TARGET_CARRIER_IS_PC) {
    ini_set('session.use_cookies'     , 1);
    ini_set('session.use_only_cookies', 1);
} else {
/* Mobile */
    ini_set('session.use_cookies'     , 0);
    ini_set('session.use_only_cookies', 0);
    ini_set('session.use_trans_sid'   , 1);
}
?>

で、Ethna_Sessionを探ってみるとコンストラクタで以下の様な部分を発見。

<?php
if (strcasecmp($_SERVER['REQUEST_METHOD'], 'post') == 0) {
    $http_vars =& $_POST;
} else {
    $http_vars =& $_GET;
}
if (array_key_exists($this->session_name, $http_vars) && $http_vars[$this->session_name] != null) {
    $_COOKIE[$this->session_name] = $http_vars[$this->session_name];
}
?>

なるほど…、GETやPOSTでセッションIDを渡したらそれが優先されるぽい。

ってことで、まずはオーバーライドしたクラスを作成。

以下が作成したクラス。

<?php
class Common_Session extends Ethna_Session
{
    function &__construct($appid, $save_dir, $logger)
    {
        // session name
        $this->session_name = 'sess';
        $this->session_save_dir = $save_dir;
        $this->logger =& $logger;
        
        if ($this->session_save_dir != "") {
            session_save_path($this->session_save_dir);
        }
        
        session_name($this->session_name);
        session_cache_limiter('private, must-revalidate');
        
        $this->session_start = false;
        if (isset($_SERVER['REQUEST_METHOD']) == false) {
            return;
        }
        // モバイル時のみHTTP VARSのセッションID使用
        if (!ini_get('session.use_only_cookies')) {
            if (strcasecmp($_SERVER['REQUEST_METHOD'], 'post') == 0) {
                $http_vars =& $_POST;
            } else {
                $http_vars =& $_GET;
            }
            if (array_key_exists($this->session_name, $http_vars)
                && $http_vars[$this->session_name] != null) {
                $_COOKIE[$this->session_name] = $http_vars[$this->session_name];
            }
        }
    }
    
    function &Common_Session($appid, $save_dir, $logger)
    {
        $this->__construct($appid, $save_dir, $logger);
    }
}
?>

んでこれをコントローラーで読み込み。

<?php
require_once 'Common_Session.php';

class AppID_Controller extends Ethna_Controller
    var $class = array(
        'session'       => 'Common_Session',
    );
}
?>

これで携帯ではHTTPベース、PCではCookieベースのセッションが可能。



PS:
さっさと時間作って、MPCの開発を進めたい今日この頃。

MPCの開発手伝ってくれる優しい方はいませんかね><