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