User-AgentとBlade.phpを使った表示切り替え
はじめに
Webサービスを開発していると、「PCではこの表示にしたい」「スマホではレイアウトを変えたい」といった場面がよくあります。
もちろん最近ではレスポンシブ対応で解決することも多いですが、場合によってはサーバー側で端末を判定し、表示そのものを切り替えたいケースもあります。
Laravel では、User-Agentを利用することでアクセス端末を判定でき、Blade.phpと組み合わせることで柔軟な表示制御が可能になります。
今回は、その基本的な考え方について簡単にまとめたいと思います。
User-Agentとは
User-Agentとは、ブラウザや端末情報をサーバーへ伝えるための文字列です。
例えば、
- iPhoneからのアクセス
- Androidからのアクセス
- ChromeやSafariなどのブラウザ情報
などが含まれています。
Laravel ではリクエストヘッダーから簡単に取得できます。$userAgent = request()->header('User-Agent');
実際に出力すると、かなり長い文字列が返ってきます。Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) …
Blade.phpで表示を切り替える
User-Agent を利用すると、Blade 側で条件分岐による表示変更ができます。
例えば、スマホかどうかを判定して表示を変えるケースです。
$isMobile = str_contains($userAgent, 'iPhone')
|| str_contains($userAgent, 'Android');
Blade では以下のように使用できます。
@if ($isMobile)
スマホ用レイアウト
@else
PC用レイアウト
@endif
これによって、端末ごとに異なるUIを表示できます。
コントローラーからBladeへ渡す
実際には、Controller 側で判定して Blade に渡すことが多いです。
public function index(Request $request)
{
$userAgent = $request->header('User-Agent');
$isMobile = str_contains($userAgent, 'iPhone')
|| str_contains($userAgent, 'Android');
return view('index', [
'isMobile' => $isMobile,
]);
}
Blade 側:
@if ($isMobile)
モバイル表示
@else PC表示@endif
ロジックを Blade に直接書きすぎないため、見通しも良くなります。
実務でよくある利用例
実際の開発では、以下のような場面で利用されることがあります。
- スマホ専用バナー表示
- アプリ誘導導線の切り替え
- PC専用UIの非表示
- ダウンロードボタンのOS切り替え
- 一部機能の出し分け
例えば、iPhoneなら App Store、Androidなら Google Play のリンクを表示するといったケースです。
@if ($isIos)
<a href="#">App Store</a>
@elseif ($isAndroid)
<a href="#">Google Play</a>
@endif
User-Agent判定の注意点
便利な一方で、User-Agent 判定には注意点もあります。
文字列は端末ごとに異なる
User-Agent は非常に長く、ブラウザやOSアップデートによって変化することがあります。
そのため、単純な文字列判定だけでは漏れが出る可能性があります。
完全な判定は難しい
タブレット判定や特殊ブラウザなど、細かく対応し始めると複雑になります。
そのため、
軽い出し分け → User-Agent
レイアウト調整 → CSSレスポンシブ
というように役割を分けることも重要です。
ライブラリの利用
より正確に判定したい場合は、ライブラリを利用することもあります。
Laravel では jenssegers/agent が有名です。
$agent->isMobile();
$agent->isTablet();
$agent->isDesktop();
のように直感的に判定できるため、実務でも使いやすいライブラリです。
最後に
User-Agent と Blade.php を組み合わせることで、端末ごとに柔軟な表示制御が可能になります。
最近ではレスポンシブデザインが主流ではありますが、サーバー側で出し分けたいケースは今でも少なくありません。
「どこまでをCSSで対応するか」「どこからをサーバー側で制御するか」を考えながら使い分けることが、保守しやすい実装につながると考えています。