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の開発手伝ってくれる優しい方はいませんかね><