laravel

ミドルウェアとは

ミドルウェアとは

コントローラクラスの処理の前後におき、HTTPリクエストのフィルタリングやHTTPレスポンスの変更を担っています。

例えばログインをしていないと実行できないような制限をかける際にミドルウェアの機能を利用します。

グローバルミドルウェアシステム全体で使用
ルートミドルウェア特定のルートに対して適用
コンストラクタ内ミドルウェアコントローラクラスのコストラクタで指定

ミドルウェアの作成手順(Lravel 6)

  1. artisanコマンドでミドルウェアクラスの生成
  2. ミドルウェアの中身の編集
  3. ミドルウェアの登録
  4. ミドルウェアの実行箇所の設定

グローバルミドルウェアやルートミドルウェアの実装に違いはなく、どのタイミングで実行させるかを指定させます。

1.artisanコマンドでミドルウェアクラスの生成

コマンドでの生成

下記のartisanコマンドで生成します。

// php artisan make:middleware [ミドルウェアの名称]
php artisan make:middleware BeforeMiddleware
php artisan make:middleware AfterMiddleware

app/Http/Middlewaresディレクトリ配下に生成されます。

BeforeMiddleware.phpの中身は以下のようになっています。

<?php

namespace App\Http\Middleware;

use Closure;

class BeforeMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

2.ミドルウェアの編集

生成されたMiddlewareクラス内にあるhandle()に実装内容を追記していきます。

<?php

namespace App\Http\Middleware;

use Closure;

class BeforeMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // コントローラに渡る前に実行
        if($request->age >= 20){
            return view('auth.before');
        }
        return $next($request);
    }
}
<?php

namespace App\Http\Middleware;

use Closure;

class AfterMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        // コントローラに渡った後に処理が実行
        if($response->age >= 20){
            return view('auth.after');
        }
        return $response;
    }
}

3.ミドルウェアの登録

ミドルウェアを作っただけでは使えません。

ミドルウェアの登録はApp/Http/Kernel.phpに登録する必要があります。

3つの箇所があり、用途に合わせて登録ができます。

グローバル登録全てのアクセスに共通して処理を行いたい$middleware に登録
グループ登録複数のミドルウェアをまとめて(グループ)登録したい$middlewareGroups に登録
ルート登録特定のルートやコントローラ対して適用したい$routeMiddleware にキーと共に登録

グローバル登録

すべてのルートにミドルウェアを適用するには、app/Http/Kernel.phpの$middlewareプロパティに追記します。

protected $middleware = [
    // 該当ミドルウェアのパス
    \App\Http\Middleware\TrustProxies::class,
    \App\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

グループ登録

複数のミドルウェアをまとめて(グループ)登録するには、app/Http/Kernel.phpの$middlewareGroupsプロパティに追記します。

protected $middlewareGroups = [
    //'グループミドルウェア名' => [
    //    完全な名前空間::class, 
    //    ,,,,
    //],

    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

ルート登録

グループ登録もしくはルート登録したミドルウェアを使うための設定を行っていきます。

protected $routeMiddleware = [
    //'ミドルウェア名' => 完全な名前空間::class,
    '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,
    'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];

4.ミドルウェアの設定

ルート登録したミドルウェアを適用する

「->middleware(‘ミドルウェア名’, ‘ミドルウェア名’,,,)」と指定していきます。

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

名前空間でも指定することができます。

use App\Http\Middleware\CheckAge;

Route::get('admin/profile', function () {
    //
})->middleware(CheckAge::class);

グループ登録したミドルウェア

ルート登録した場合と同じように名前で指定ができます。

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

参考文献

公式ドキュメント

https://laravel.com/docs/6.x/middleware

参考にした記事

https://laraweb.net/practice/1396/

https://qiita.com/shizen-shin/items/5e050bf07b2257a6a1d7

https://qiita.com/niisan-tokyo/items/663300f8df1c6c89f0ae

Laravel6におけるミドルウェアについては以上です。