FuelPHPのAgentクラスと拡張

FuelPHPのAgentクラスは、下記URLからブラウザ情報を取得し、これを元にプラットフォーム等の判定を行っています。

http://browsers.garykeith.com/stream.asp?Lite_PHP_BrowsCapINI

上記URLへアクセスは最初に1度のみで、それ以降はキャッシュとして保持されます。
(アクセス先URL、ファイル保存先はhttp://docs.fuelphp.com/classes/agent/config.html:設定ファイルで変更可能)

これを元に判定されたユーザーエージェント情報は、以下の関数で取得する事になります。(諸々の使い方は公式ドキュメント参照)

accepts_charset($charset = 'utf-8')

指定charsetがHTTP_ACCEPT_CHARSETに含まれるか

accepts_language($language = 'en')

指定languageがHTTP_ACCEPT_LANGUAGEに含まれるか

browser()

ブラウザ名(Firefox,IE,Chrome...)

platform()

プラットフォーム(Win95,Win98,WinNT...)

version()

ブラウザのバージョン

charsets()

HTTP_ACCEPT_CHARSET一覧

languages()

HTTP_ACCEPT_LANGUAGE一覧

properties()

プロパティ一覧

property($property = null)

指定プロパティの値

is_mobiledevice()

モバイル判定(スマホ含む)

is_robot()

ロボット判定



上記の関数を見てもらうと分かりますが、現状ではスマホの判定を行う関数がないようですので、Agentクラスを拡張し、スマホ判定の関数を追加してみたいと思います。

まずは『fuel/app/classes/agent.php』を用意します。

<?php
class Agent extends Fuel\Core\Agent
{
    public static function _init()
    {
        parent::_init();

        $sp_list = array(
                       'iPhone',
                       'iPod',
                       'Android',
                       'IEMobile',
                       'dream',
                       'CUPCAKE',
                       'blackberry9500',
                       'blackberry9530',
                       'blackberry9520',
                       'blackberry9550',
                       'blackberry9800',
                       'webOS',
                       'incognito',
                       'webmate'
                   );

        $pattern = '/'.implode('|', $sp_list).'/i';
        static::$properties['x_issmartphone'] = preg_match($pattern, static::$user_agent) ? true : false;
    }

    public static function is_smartphone()
    {
        return static::$properties['x_issmartphone'];
    }
}

※スマホのUAリストはこちらを参考にさせて頂きました。

次に『fuel/app/bootstrap.php』に対し、Agentを追加します。

Autoloader::add_classes(array(
        // Add classes you want to override here
        // Example: 'View' => APPPATH.'classes/view.php',
        'Agent' => APPPATH.'classes/agent.php'
));

上記の設定が完了すれば、以下の呼び出しが可能になります。

if (Agent::is_smartphone()) {
    // スマホ用処理
}