symfony1.4 モバイルページのsessionの取り扱い

モバイルページでPC系ページと大きく異なるのは以下の2点。

  • 文字コード(sjis)
  • Cookieが使えない(session_idの持ち回り)

文字コードに関しては、以前のエントリ分で対応出来るとして、session周りをどうするか。

色々調べまわって、結局以下で対応しました。

(手持ちの機種、シミュレータでの確認でも概ねOK)

 

手順:

  1. myMobileSessionStorage.class.php作成
  2. schema.yml編集
  3. insert-sql実行
  4. factories.yml編集
  5. 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