cakephpでスマートフォンかどうか判定する
July 12, 2013,
tags:
cakephp
php
会社ではSymfony2、自宅ではCakePHP2という二重生活な僕です。
さて、今日はcakephpでスマートフォンかどうかを判定するってお話です。
「cakephp スマホ 判定」でググってみるとわりとひどい結果ばかり(´・ω・`)
やっぱりみんなそんなにコントローラで処理したいんですかね…
僕はあまり賛成できないです。AppControllerで書けば確かにロジック共有できますけど、、、きもい、、、まじきもいーーー。。。
ってことでじゃあお前ならどうすんだよ?って話ですよね。
そうです、僕ならRequestHandlerComponentコンポーネントを使います。
しってます?RequestHandlerComponentにisMobile()ってメソッドがあることを。
まあぶっちゃけコントローラの中で以下のように書いても挙動的には一緒ですけどね。
$this->request->is('mobile')
RequestHandlerComponent::isMobuile()やCakeRequest::is('mobile')
はガラケーも判定されてしまうじゃねーかw
って突っ込んでしまいたくなりますよね。
じゃあどうすればいいの?
僕ならRequestHandlerComponentを拡張しますよーw
まあ本音はCakeRequestを継承していじりたいんですけどね。。。。それは無理なので。。。
こんな感じに
app/Controller/Component/MyRequestHandlerComponent.php
<?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
<?php
class HogeController extends AppController
{
public $components = array('RequestHandler' => array('className' => 'MyRequestHandler'));
public function index() {
if ($this->RequestHandler->isSmartPhone()) {
debug('smart phone access!!');
}
}
}
こんな感じが良いかと思いますー!