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になっているので、コントローラやビューなどで文字コードを気にする必要はないです。