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
-
class myMobileFilter extends sfFilter
-
{
-
public function execute ($filterChain)
-
{
-
if ($this->isFirstCall())
-
{
-
if ($er> E_STRICT) {
-
}
-
require_once('Net/UserAgent/Mobile.php');
-
$agent = Net_UserAgent_Mobile::singleton();
-
$this->getContext()->getRequest()->setAttribute('agent', $agent);
-
}
-
-
// execute next filter
-
$filterChain->execute();
-
}
-
}
フィルターのご作法にのっとり、とりあえず書いてみた。14行目で"agent"という属性を予約して、オブジェクトをぶち込んでいる。
8~11行目のエラーの取り扱いは、なぜかdevモードでNet_UserAgent_Mobileをrequire_onceすると、Strict Standards:~というwarningが気になったので、入れている。
filterを登録するには下記のようにfilters.ymlを編集する。
app/app_dir/config/filters.yml
-
rendering: ~
-
web_debug: ~
-
security: ~
-
myMobileFilter:
-
class: myMobileFilter
-
cache: ~
-
common: ~
-
flash: ~
-
execution: ~
そして利用する場合、actionクラス内なら
-
if ($this->getRequest()->getAttribute('agent')->isDoCoMo()){
-
}
view内なら
-
<?php if $sf_request->getAttribute('agent')->isDoCoMo()): ?>
こんな感じで呼び出し可能。
sfRequestに詰め込むのが、ちょっと気持ち悪い気もするが、これでいいのか、もう少し検証が必要。
なお、Net_UserAgent_Mobileは、結構更新されるようなので、Pearの更新RSSフィードを取得しておけば、運用面も安心だ。
Check Tweet


Pingback: トライアウト ラボラトリ! » Blog Archive » » Symfonyでモバイルの機種判別をする