ヒビノログ

個人的なメモを淡々と記録していくブログ。最近はLaravelやスマートフォンの話題など。

Laravelでガラケー対応する場合のTips

Laravelを使ってフィーチャーフォン対応する場合の文字コード変換関連のTips。

PC、スマホだけでなくフィーチャーフォンにも対応しなければならない場合でも、コンテンツ生成などのロジックは一本で済ませたいもの。その場合、フィーチャーフォンからのリクエスト(ShiftJIS)を処理の最初でUTF8に変換し、レスポンスをUTF8からShiftJISに変換してあげれば中の処理(DB含め)はUTF8に統一できる。 こういった処理は、Laravelではフィルタを使って実装すればOK。

ヘルパあたりにUAの判定や文字コード変換などの処理を定義しておいて... app/extensions/helper.php

<?php
if ( ! function_exists('isMobile'))
{
    // フィーチャーフォンかどうかの判定。基準はお好みで。
    function isMobile()
    {
        $agent = Request::server('HTTP_USER_AGENT');
        if (preg_match("/^DoCoMo/i", $agent) || 
            preg_match("/^(J\-PHONE|Vodafone|MOT\-[CV]|SoftBank)/i", $agent) || 
            preg_match("/^KDDI\-/i", $agent) || preg_match("/UP\.Browser/i", $agent))
        {
            return true;
        }
        return false;
    }
}

if ( ! function_exists('convenc'))
{
    // 配列の文字コード変換処理。
    function convenc($array, $to = 'UTF-8', $from = 'SJIS')
    {
        $result = array();

        foreach ($array as $key => $value)
        {
            // リクエストが配列になってる場合はさらに潜って変換
            if (is_array($value))
            {
                $result[$key] = convenc($value, $to, $from);
            }
            else
            {
                $result[$key] = mb_convert_encoding($value, $to, $from);
            }
        }

        return $result;
    }
}

Appのbeforeフィルタとafterフィルタで変換処理を行う。 app/start/global.php

App::before(function($request)
{
    if (isMobile())
    {
        // ShiftJIS -> UTF8
        $converted = convenc(Input::get());
        Input::merge($converted);
    }
});

App::after(function($request, $response)
{
    if (isMobile())
    {
        // UTF8 -> ShiftJIS
        $content = $response->getContent();
        $content = mb_convert_encoding($content, 'SJIS', 'UTF-8');
        $response->header('Content-Type', 'text/html; charset=Shift_JIS');
        $response->setContent($content);
    }
});

こうしておけば routs.php に来た時点で文字コードがUTF8になっているので、コントローラやビューなどで文字コードを気にする必要はないです。