cakephpでスマートフォンかどうか判定する

Twitter ツイート Hatena Bookmark ブックマーク

会社ではSymfony2、自宅ではCakePHP2という二重生活な僕です。
さて、今日はcakephpでスマートフォンかどうかを判定するってお話です。

「cakephp スマホ 判定」でググってみるとわりとひどい結果ばかり(´・ω・`)
やっぱりみんなそんなにコントローラで処理したいんですかね…
僕はあまり賛成できないです。AppControllerで書けば確かにロジック共有できますけど、、、きもい、、、まじきもいーーー。。。

ってことでじゃあお前ならどうすんだよ?って話ですよね。

そうです、僕ならRequestHandlerComponentコンポーネントを使います。

しってます?RequestHandlerComponentにisMobile()ってメソッドがあることを。
まあぶっちゃけコントローラの中で以下のように書いても挙動的には一緒ですけどね。

1
$this->request->is('mobile')

RequestHandlerComponent::isMobuile()やCakeRequest::is('mobile') はガラケーも判定されてしまうじゃねーかw
って突っ込んでしまいたくなりますよね。

じゃあどうすればいいの?

僕ならRequestHandlerComponentを拡張しますよーw
まあ本音はCakeRequestを継承していじりたいんですけどね。。。。それは無理なので。。。

こんな感じに
app/Controller/Component/MyRequestHandlerComponent.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
App::uses('RequestHandlerComponent', 'Controller/Component');

class MyRequestHandlerComponent extends RequestHandlerComponent
{
    public function isSmartPhone() {
        $ua = env('HTTP_USER_AGENT');
        return ((strpos($ua,'iPhone')!==false) || (strpos($ua,'iPod') !== false) || (strpos($ua,'Android') !== false));
    }
}

あとはコントローラ側で、以下のように指定してあげましょう。
app/Controller/HogeController.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
class HogeController extends AppController
{
    public $components = array('RequestHandler' => array('className' => 'MyRequestHandler'));

    public function index() {
        if ($this->RequestHandler->isSmartPhone()) {
            debug('smart phone access!!');
        }
    }
}

こんな感じが良いかと思いますー!

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。