symfonyで携帯開発、第1弾。

機種の判定をテンプレートとプログラムでできるようにする

を実現する。

Perlでは有名なcpanモジュール、HTTP::MobileAgent。PHPでも同じようなモジュール、 PEAR::Net_UserAgent_Mobileがあるようだ。

さっそくインストール。pearを使って、簡単にインストールできる。

pear install -f -o net_userAgent_mobile

さてsymfonyで、どのように利用するのがいいのか。その場でrequire_onceしてしまっても問題ないが、symfonyの場合、フィルターを使えば、共通なインターフェースで利用できそうなので、フィルターを作ってみる。

app/app_dir/lib/myMobileFilter.class.php

PHP:
  1. <?php
  2. class myMobileFilter extends sfFilter
  3. {
  4.   public function execute ($filterChain)
  5.   {
  6.   if ($this->isFirstCall())
  7.   {
  8.     $er = error_reporting();
  9.     if ($er> E_STRICT) {
  10.       error_reporting($er - E_STRICT);
  11.     }
  12.     require_once('Net/UserAgent/Mobile.php');
  13.     $agent = Net_UserAgent_Mobile::singleton();
  14.     $this->getContext()->getRequest()->setAttribute('agent', $agent);
  15.   }
  16.  
  17.   // execute next filter
  18.   $filterChain->execute();
  19.   }
  20. }

フィルターのご作法にのっとり、とりあえず書いてみた。14行目で"agent"という属性を予約して、オブジェクトをぶち込んでいる。

8~11行目のエラーの取り扱いは、なぜかdevモードでNet_UserAgent_Mobileをrequire_onceすると、Strict Standards:~というwarningが気になったので、入れている。

filterを登録するには下記のようにfilters.ymlを編集する。

app/app_dir/config/filters.yml

CODE:
  1. rendering: ~
  2. web_debug: ~
  3. security:  ~
  4. myMobileFilter:
  5.   class: myMobileFilter
  6. cache:     ~
  7. common:    ~
  8. flash:     ~
  9. execution: ~

そして利用する場合、actionクラス内なら

PHP:
  1. if ($this->getRequest()->getAttribute('agent')->isDoCoMo()){
  2. }

view内なら

PHP:
  1. <?php if $sf_request->getAttribute('agent')->isDoCoMo()): ?>

こんな感じで呼び出し可能。

sfRequestに詰め込むのが、ちょっと気持ち悪い気もするが、これでいいのか、もう少し検証が必要。

なお、Net_UserAgent_Mobileは、結構更新されるようなので、Pearの更新RSSフィードを取得しておけば、運用面も安心だ。

関連する記事

blogranking←ぽちっとな

<<
>>