今日はLaravelのミドルウェアについてお伝えしていきます。まずミドルウェアとは何かについて考えていきましょう。
ミドルウェアとは
ミドルウェアとは、一言で言うとフィルターです。httpリクエストを定めたものだけを通すことができるようになります。
よくわかる例としては、下記のようなものがあるでしょう。
- レスポンス時|viewのhtmlを最小の大きさにする
- レスポンス時|生成したjsonに値を加える
- リクエスト|特定のユーザーのみに特定ページを見せる
- リクエスト| IPに制限をかけて閲覧制限をもうける
ミドルウェアを理解するには、下記の記事を読んでLaravelのライフサイクルを理解した方がより良いかと思います。
同じ図を添付しますね。
ここを見てもらうとわかるように、リクエスト/レスポンスがHttpカーネル(赤い部分)を通る時にミドルウェアの定義をしているのがわかります。ここでミドルウェアを定義してフィルタリングを行なうことができるのです。
ミドルウェアの種類
ミドルウェアには、以下の3種類がLaravelでは存在しています。
1,グローバルミドルウェア
2,ルートミドルウェア
3.コンストラクタミドルウェア
下記、矢印がhttpリクエストだとして、どのようにミドルウェアがリクエストを通すのかを図で表しています。

グローバルミドルウェア、ルートミドルウェア、コンストラクタないミドルウェアの順番で処理をしていきます。
また、ミドルウェアはリクエストだけではなく、レスポンスを返す時にも処理を実行します。
ミドルウェアを実装する
さて、実際にどのようにミドルウェアを作っていくのかを見ていきましょう。
作成
php artisan make:middleware CheckHeight
上記コマンドにより、checkHeightクラスがapp/Http/Middlewareディレクトリに生成されます。このミドルウェアでは、身長が180cm以上の人のみがアクセスできるようにフィルタリングをかけます。
<?php namespace App\Http\Middleware; use Closure; class CheckHeight { public function handle($request, Closure $next) { if ($request->height <= 180) { return redirect('home'); } return $next($request); } }
上記の場合のミドルウェアだと、180cm以下の人はhomeページへredirectが送られてしまいます。
ミドルウェアのフィルタリングにひっからないと、$requestが次の段階に進むことができます。
ミドルウェアの実行タイミング
基本的なミドルウェアの書き方は上記で構いませんが、
実行のタイミングをhttpリクエストの前なのか後なのかを変えることができます。
$next($request)部分にて、次の段階(ミドルウェアなど)に渡すかどうかを定義しています。
この部分よりも前に書くのであれば、リクエストを処理するよりも前に処理をして、後に書くとリクエストを処理した後に実行されます。
終了時処理
ミドルウェアにterminateメソッドを定義すると、レスポンスがブラウザへ送られる準備ができた後に自動的に呼び出されます。
ミドルウェアの登録
ここまでで、ミドルウェアの定義、書き方をお伝えしましたが、これだけでは実際に使うことはできません。
自身で作成したミドルウェアを先ほど紹介した3つのどの種類で実行するのかの登録をする必要があります。
*登録場所は、全てapp/Http/Kernel.phpにて登録することは変わりません。
グローバルとして登録する
protected $middleware の配列内に記載
ルートに対して登録する
protected $routeMiddleware の配列内に記載
グループで登録する
protected $middlewareGroups = ‘web’ =>
通常は、web,apiのどちらかに記載して、httpリクエスト発生時の処理をさばきます。
それ以外で新しいグループを定義する場合は、middlewareGroups内に配列構造で記載してください。
優先漬けをして登録する
この配列内に記載することで、グローバルでないミドルウェアの順番漬けを行います。
protected $middlewarePriority
デフォルトで使用されているミドルウェア
デフォルトで使用されているミドルウェアを一覧として述べておきます。時間のある時にどのようなミドルウェアなのかを更新していきますね。
グローバル
AppHttpMiddlewareCheckForMaintenanceModeclass,
IlluminateFoundationHttpMiddlewareValidatePostSizeclass,
AppHttpMiddlewareTrimStringsclass,
IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNullclass,
AppHttpMiddlewareTrustProxiesclass,
];
ルートミドルウェア(グループ)
AppHttpMiddlewareEncryptCookiesclass,
IlluminateCookieMiddlewareAddQueuedCookiesToResponseclass,
IlluminateSessionMiddlewareStartSessionclass,
// IlluminateSessionMiddlewareAuthenticateSessionclass,
IlluminateViewMiddlewareShareErrorsFromSessionclass,
AppHttpMiddlewareVerifyCsrfTokenclass,
IlluminateRoutingMiddlewareSubstituteBindingsclass,
ルートミドルウェア(特定のルートのみ)
‘auth’ => IlluminateAuthMiddlewareAuthenticateclass,
‘auth.basic’ => IlluminateAuthMiddlewareAuthenticateWithBasicAuthclass,
‘bindings’ => IlluminateRoutingMiddlewareSubstituteBindingsclass,
‘can’ => IlluminateAuthMiddlewareAuthorizeclass,
‘guest’ => AppHttpMiddlewareRedirectIfAuthenticatedclass,
‘throttle’ => IlluminateRoutingMiddlewareThrottleRequestsclass,];

コメントを残す