はじめに

今回やりたいことは、ページの日本語/英語の表示切り替えで、設定内容をセッションで保持してページの読み込み時にセッションに保持された設定があれば反映する、ということです。

コントローラのコンストラクタに書けばいいかと思い調べてみたら、Laravel5.3以降は普通に書いても動かなくなったということで(参考ページ)回避策として下のような書き方が使えるということがわかりました。

public function __construct()
{
    $this->middleware(function ($request, $next) {
        if (session('lang')) {
            \App::setLocale(session('lang'));
        }
    
        return $next($request);
    });
}

ですがせっかくなのでミドルウェアを定義してみようと思います。Laravelのバージョンは5.7です。

実装

ミドルウェア作成

$ php artisan make:middleware Lang
<?php

namespace App\Http\Middleware;

use Closure;

class Lang
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (session('lang')) {
            \App::setLocale(session('lang'));
        }

        return $next($request);
    }
}

ミドルウェア登録

app/Http/Kernel.php の $routeMiddleware プロパティに追加します。

/**
 * The application's route middleware.
 *
 * These middleware may be assigned to groups or used individually.
 *
 * @var array
 */
protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    'lang' => \App\Http\Middleware\Lang::class, // 追加
];

コントローラのコンストラクタに以下のように書いたり、

/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware('lang');
}

ルート定義に書いて使うことができます。

Route::get('/', function () {
    //
})->middleware('lang');