Laravelでミドルウェアでモバイル判定処理をして、全てのViewでisMobile変数を呼べるようにする
Laravelでミドルウェアでモバイル判定処理をして、全てのViewでisMobile変数を呼べるようにする
モバイル判定方法1.ヤバイパターン
まずは、ヤバイパターンとして、
モバイル判定処理を1つ1つコントローラに書いて、ビューに反映する場合
以下をすべてのコントローラーに書くのはなかなかヤバイですね…
<?php //~略~ $agent = app('agent'); return view('index', [ 'isMobile' => $agent->isMobile(), ]);
モバイル判定方法2.楽なパターン
そこで、View::share で全てのビューで使うグローバル変数を定義して、
さらに、その処理をBeforeミドルウェアを使って、リクエストがきたら行う共通処理にしておきます。
その前に、composerからモバイルのエージェントの判定できるライブラリ
github.com
をインストールしておきます。
エージェント判定ライブラリをインストール
composer require jenssegers/agent
config/app.php
<?php 'providers' => [ Jenssegers\Agent\AgentServiceProvider::class, //追加 ], 'aliases' => [ 'Agent' => Jenssegers\Agent\Facades\Agent::class, //追加 ],
次にミドルウェアを作っていきます。
Middleware の作成
php artisan make:Middleware GetIsMobile
Kernel.phpにMiddleware を追加
全てのリクエストで処理をするため、$middlewareプロパティに追加します。
App\Http\Kernel.php
<?php protected $middleware = [ \App\Http\Middleware\CheckForMaintenanceMode::class, ~略~ \App\Http\Middleware\GetIsMobile::class, //<-追加 ];
全てのHTTPリクエスト時にモバイル判定処理を走らせる準備ができました。
MiddlewareにView::shareでグローバル変数を定義していきます。
View::shareでグローバル変数
App/Http/Middleware/GetIsMobile.php
<?php namespace App\Http\Middleware; use Closure; use Agent; use Illuminate\Http\Request; use Illuminate\Support\Facades\View; //View::share用 class GetIsMobile { public function handle($request, Closure $next) { $agent = app('agent'); View::share(['isMobile' => $agent->isMobile()]); return $next($request); } }
これで、どのページを開いてもblade内で
{{ $isMobile }}変数が使えるようになりました。