Zend_Http_UserAgentでの個別デバイスクラスの記述

Zend Framework1.11では、Zend_Http_UserAgentというブラウザデバイスの各種情報取得判定のためのコンポーネントが登場しますが、現状デフォルトで用意されているデバイスクラス(Zend_Http_UserAgent_Deviceインターフェイスの実装)以外のクラスを用意したい場合の利用メモです。ここでは、ガラパゴスというiPhoneとかBlackべりーとかのとはちょっと世界の世間とは隔離されたデバイスに関して処理したい場合のクラスを用意してみます。


サーバー情報は、(ZFの他のコンポーネント同様に)Zend_Http_UserAgentのインスタンス生成時でのコンフィグ用引数にあればそれを使用し、ない場合は$_SERVERグローバル変数です。


バイス取得情報などは一旦storageに格納したものを使い回すようです。デフォルトはSessionです。

ユーザ定義のクラスを利用するにはいくつか手段があるっぽいですが、

$config['mobile']['device']['classname'] = 'Test_Galapagos';

のように設定すると単純にロードされます。

<?php
class BarContoller extends Zend_Contoller_Action
{
    public function fooAction()
    {
        $this->getHelper('ViewRenderer')->setNoRender(true);

        //デバッグ用設定
        $config['server'] = $this->getRequest()->getServer();
        $config['server']['http_host'] = '192.168.0.1';
        $config['server']['http_user_agent'] = 'willcom';


        $config['storage']['adapter'] = 'NonPersistent';

        $config['mobile']['device']['classname'] = 'Test_Galapagos';

        $useragent = new Zend_Http_UserAgent($config);
        
        if ($useragent->getDevice()->getType() == 'galapagos') {
            echo '192.168.0.1はわたしが所有しているIPアドレスです';
        } else {
            echo 'sorry, Japanese Only';
        }  
        
    }   
        
}

class Test_Galapagos extends Zend_Http_UserAgent_AbstractDevice
{   
    public static function match($userAgent, $server)
    {   
        if ('192.168.0.1' === $server['http_host'] && 
            preg_match('/^willcom/', $userAgent) ) {
            return true;
        }
        
        return false;
    }

    public function getType()
    {
        return 'galapagos';
    }
}


ユーザ定義クラスでは上記matchメソッドでの判定によってそのクラスをデバイスクラスとして利用するか決定されます。