symfony1.4 モバイルページのsessionの取り扱い
2011年5月13日モバイルページでPC系ページと大きく異なるのは以下の2点。
- 文字コード(sjis)
- Cookieが使えない(session_idの持ち回り)
文字コードに関しては、以前のエントリ分で対応出来るとして、session周りをどうするか。
色々調べまわって、結局以下で対応しました。
(手持ちの機種、シミュレータでの確認でも概ねOK)
手順:
- myMobileSessionStorage.class.php作成
- schema.yml編集
- insert-sql実行
- factories.yml編集
- symfony cc
注意点:
- session.use_trance_sidをしていても、action内部でredirectされるとsession_idが変わるので、以下へ変更する
- $this->redirect(‘@hoge?’.SID);
- DBへのsession保存なので、garvege collectionの設定も忘れずに
- 以下のソースだと、携帯ではないキャリア(PCなど)ではセッションを持ちまわれない
myMobileSessionStorage.class.php作成
[shell]
$ mkdir lib/storage
$ vim lib/storage/myMobileSessionStorage.class.php
[/shell]
[php]
<?php
/**
* セッションストレージクラス
*
* @author $Auth$
* @version $Rev$
* @update $Date$
*/
require_once(‘Net/UserAgent/Mobile.php’);
class myMobileSessionStorage extends sfPDOSessionStorage
{
public function initialize($options = array())
{
//E_STRICT NOTERROR VIEW
$er = error_reporting();
if ($er> E_STRICT) {
error_reporting($er – E_STRICT);
}
// useragent
$agent = &Net_UserAgent_Mobile::singleton();
// sfContextへ保存
sfContext::getInstance()->getRequest()->setAttribute(‘userAgent’, $agent);
if ($agent->isDoCoMo() || $agent->isVodafone() || $agent->isEZweb()) {
ini_set(“session.use_trans_sid”, 1);
// set session name
$sessionName = sfContext::getInstance()->getRequest()->getParameterHolder()->get(‘session_name’, ‘PHPSSID’);
$sessionId = sfContext::getInstance()->getRequest()->getParameter($sessionName, ”);
if ($sessionId != ”) session_id($sessionId);
} else {
// for pc
$use_cookies = (boolean) ini_get(‘session.use_cookies’);
if (!$use_cookies) {
$sessionId = $context->getRequest()->getParameter($sessionName, ”);
if ($sessionId != ”) session_id($sessionId);
}
}
parent::initialize($options);
}
}
[/php]
schema.ymlを編集
[shell]
$ vim config/schema.yml
…
session:
_attributes: { phpName: Session }
id: { phpName: Id, type: VARCHAR, size: ‘255’, primaryKey: true, required: true }
data: { phpName: Data, type: LONGVARCHAR, required: false }
updated_at: { phpName: UpdatedAt, type: INTEGER, size: ’11’, required: false }
[/shell]
insert-sql 実行
[shell]
$ symfony propel:insert-sql
$ symfony propel:build-schema
$ symfony propel:build-model
$ symfony propel:build-forms
$ symfony propel:build-filters
[/shell]
factories.ymlを編集
[shell]
$ vim apps/<<app_name>>/config/factories.yml
…
# session
storage:
class: myMobileSessionStorage
param:
db_table: session
database: propel
db_id_col: id
db_data_col: data
db_time_col: updated_at
session_cookie_domain: .example.com
session_name: PHPSSID
[/shell]
念の為、cc
[shell]
$ symfony cc
[/shell]