Laravel Middleware 調べてみた

LaravelにおけるMiddleware

コントローラーの前後に実行する処理。

主な種類として3種類あります。

・グローバルミドルウェア

・ルートミドルウェア

・コンストラクタ内のミドルウェア

上記3つのミドルウェアともミドルウェアの機能は一緒ですが、実行される順番が違います。

①グローバルミドルウェア

②ルートミドルウェア

③コンストラクタ内ミドルウェア

④コントローラーの処理

⑤コンストラクタ内ミドルウェア

⑥ルートミドルウェア

⑦グローバルミドルウェア

この順番で実行されていきます。ミドルウェアによっては順番が大切になるものもあるので、覚えておきましょう。

また、Laravelではデフォルトで実装されているミドルウェアが複数あります。

 

グローバルミドルウェア

グローバルミドルウェアは、アプリケーション内全ての処理に実行されるミドルウェアです。

設定場所は、App\Http\Karnel.phpになります。

protected $middleware = [ 
// \App\Http\Middleware\TrustHosts::class,
 \App\Http\Middleware\TrustProxies::class,
 \Fruitcake\Cors\HandleCors::class,
 \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
 \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
 \App\Http\Middleware\TrimStrings::class,
 \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

middlewareプロパティ内に定義されてるものがグローバルミドルウェアとして実装されるものになります。

 

ルートミドルウェア

ルートミドルウェアは、ルーター単位で処理を分けることができるミドルウェアです。

設定場所は、App\Http\Karnel.phpになります。

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

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

middlewareGroup内に定義されていて、キーによって処理するルーターを分けています。

web内に記述されたミドルウェアは、web.php内の処理全てで実装されます。

 

また、ルートミドルウェアには名前をつけることができます。

protected $routeMiddleware = [ 
 'auth' => \App\Http\Middleware\Authenticate::class,
  'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::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,
];

routeMiddleware内に名前をキー、クラスを値にすることで名前付きミドルウェアの設定ができます。

使い方は、ルートの設定のタイミングで差し込みます。

web.php

Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home')->middleware('auth');

 

コンストラクタ内ミドルウェア

コンストラクタ内ミドルウェアは、コントローラーのコンストラクタにミドルウェアを差し込みます。

public function __construct()
{
 $this->middleware('auth');
}

 

自作ミドルウェア

もちろん独自ミドルウェアを作ることもできます。

php artisan make:middleware ファイル名

このコマンドでファイルを作成することができます。

<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class sampleMiddleware
{
 public function handle(Request $request, Closure $next)
 {
 // 前処理
 $response = $next($request);
 // 後処理
 return $response;
 }
}

handleメソッド内に処理を書きます。

$responseの前に前処理を書き、その後後処理を書きます。

最後に$responseを返してあげれば完了です。

このファイルをグローバルミドルウェアにするかルートミドルウェアにするかコンストラクタ内ミドルウェアにするかで定義場所が変わってくるので、任意の場所に定義してください

 

以上!!!!!!!