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作成
$ mkdir lib/storage $ vim lib/storage/myMobileSessionStorage.class.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); } }
schema.ymlを編集
$ 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 }
insert-sql 実行
$ symfony propel:insert-sql $ symfony propel:build-schema $ symfony propel:build-model $ symfony propel:build-forms $ symfony propel:build-filters
factories.ymlを編集
$ 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
念の為、cc
$ symfony cc