バックエンドとフロントエンドを行き来するWEBプログラマ―のメモ帳

WEBプログラマ―。バックエンドはPHP, MySQL, CentOS系, フロントエンドはJavaScript, jQuery, HTML, CSSで仕事してます。

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 }}変数が使えるようになりました。