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

2011年5月13日 オフ 投稿者: KYO
Table of Contents

モバイルページで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作成

[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]