読者です 読者をやめる 読者になる 読者になる

Net_UserAgent_MobileにNet_UserAgent_Mobile_UserIDを組み込んでみた

PHP

Net_UserAgent_MobileのソースがGitHubで公開されています。

iteman/net-useragent-mobile · GitHub

これをforkして、Net_UserAgent_Mobile_UserIDを組み込んでみました。(Net_UserAgent_Mobile_UserIDについてはこちら→Net_UserAgent_Mobile_UserIDをリリースしました - okonomiの日記

okonomi/net-useragent-mobile · GitHub

やったこと

Net_UserAgent_Mobileには、getUID()というUID取得メソッドが用意されています。この中身をNet_UserAgent_Mobile_UserIDに丸投げするようにしました。

<?php

abstract class Net_UserAgent_Mobile_Common
{
    // 省略


    public function getUID()
    {
        if (is_null($this->_userid)) {
            require_once 'Net/UserAgent/Mobile/UserID.php';
            $this->_userid = Net_UserAgent_Mobile_UserID::factory($this);
        }

        return $this->_userid->getRawData();
    }


    // 省略
}

Net_UserAgent_Mobile_UserIDでキャリアごとの処理を吸収するので、Net_UserAgent_Mobile_Commonの各サブクラスでUID取得処理を個別に書かなくてもよくなりました。

いままでNet_UserAgent_MobileではNULLGWDOCOMOのアレとかが取得できなくて実務では使いたくても使えなかったんですが、Net_UserAgent_Mobile_UserIDはUID判別・取得を独自に追加できるのでそんな問題も解決できるかなーと思います。

<?php
/*
id=aa-12345みたいな形式を認識するようにする
*/

require_once 'Net/UserAgent/Mobile/UserID.php';
require_once 'Net/UserAgent/Mobile/UserID/Abstract.php';
require_once 'Net/UserAgent/Mobile.php';

class Hoge extends Net_UserAgent_Mobile_UserID_Abstract
{
    public function getID()
    {
        if (array_key_exists('id', $_REQUEST)) {
            return $_REQUEST['id'];
        } else {
            return null;
        }
    }

    public function validateID($id)
    {
        return preg_match('/^[a-z}{2}\-[0-9]{5}$/', $id);
    }

    protected function _parseID($id)
    {
        return array(
            substr($id, 0, 2),
            substr($id, 3),
        );
    }
}

// 独自処理を登録
Net_UserAgent_Mobile_UserID::setUserIDModules('DoCoMo', new Hoge());

$_SERVER['HTTP_USER_AGENT'] = 'DoCoMo/2.0 F05A(c100;TJ)';
$_REQUEST['id'] = 'ab-12345';
$ua =& Net_UserAgent_Mobile::singleton();
$uid = $ua->getUID(); // ab-12345