さて、symfonyで携帯開発第2弾。

セッションIDは、DoCoMoは埋め込み、AU、SoftbankはCookieを利用

これを実現する。セッション部分をオーバーライドして対応するので、複数サーバになった時に対応できるようにセッションをmysqlで管理するようについでに変更する。

まずは、sfMySQLSessionStorageをオーバーライドするクラスを作成する。
lib/storage/myMobileSessionStorage.class.php

PHP:
  1. <?php
  2. class myMobileSessionStorage extends sfMySQLSessionStorage
  3. {
  4.   public function initialize($context, $parameters = null)
  5.   {
  6.     //E_STRICT NOTERROR VIEW
  7.     $er = error_reporting();
  8.     if ($er> E_STRICT) {
  9.       error_reporting($er - E_STRICT);
  10.     }
  11.     require_once('Net/UserAgent/Mobile.php');
  12.     $agent = &Net_UserAgent_Mobile::singleton();
  13.     if ($agent->isDoCoMo())
  14.     {
  15.       ini_set("session.use_trans_sid", 1);
  16.     }
  17.     parent::initialize($context, $parameters);
  18.   }
  19. }

通常は、factories.ymlにsfMySQLSessionStorageを利用するように宣言するのだが、ソースのようにしてそれを携帯のアプリケーションの場合は登録するようにする。ちなみにドコモの場合のみini_setし、それ以外は通常通りクッキーを利用する。

apps/app_dir/config/factories.yml

CODE:
  1. all:
  2.   storage:
  3.     class:  myMobileSessionStorage
  4.     param:
  5.       db_table:            session
  6.       db_id_col:           id
  7.       db_data_col:         data
  8.       db_time_col:         updated_at
  9.       database:            propel
  10.       session_cookie_domain:   .domain.com
  11.       session_name:        s

これで、app_dirアプリケーション以下のドコモの場合のみ、URLにセッションIDがリンクに付与されるようになる。

そう、セッションテーブルを作成するのを忘れてはいけない。
config/schema.yml

CODE:
  1. propel:
  2.   session:
  3.     _attributes:  { phpName: Session }
  4.     id:           { type: varchar(32),  primaryKey: true, required: true }
  5.     data:         { type: longvarchar }
  6.     updated_at:   { type: integer }

これをsymfonyコマンドを利用して、テーブル作成する。

じつは、これだけでは足りない。actionクラスなどで、リダイレクトする場合はセッションIDが付与されない。そのため、

PHP:
  1. $this->redirect('module/action?'.SID);

このように引き継がないといけない。これもドコモだったらみたいなif文を書かないといけないのか、それとも害はなさそうなので全部そうしてしまうか・・・

redirect関数もオーバーライドすればいけそうだが、そこに関してはまた後で研究することにする(手抜き)

blogranking←ぽちっとな