【Laravel入門】middleware(ミドルウェア)とは
- 1. middleware(ミドルウェア)とは
- 2. middlewareの使用例
- 3. middlewareを使用するためにする4つのこと
- 4. middlewareの作成
- 5. kernel.phpへmiddlewareの登録
- 6.
- 7. $middlewareについての説明
- 8. middlewareGroups
- 9. $middlewareGroupsのapi
- 10. middlewareAliasesまたはrouteMiddleware
- 11. ルート毎にミドルウェアを実行
- 12. middlewareGroupsの作成例
- 13. middlewareにエイリアスを使う
- 14. web.phpのルートにミドルウェアのエイリアスを追加する方法
- 15. Controllerでミドルウェアを使用する
- 16. 実装やエラーが解決できない場合
middleware(ミドルウェア)とは
middlewareとは、HTTPリクエストが送られたタイミングで、
受信されてからレスポンスが返されるまでの間に実行される処理をカプセル化したものです。
ミドルウェアはコントローラークラスの前後で処理を行えます。
URL(リクエスト)
↓
ルーティング
↓ ⇦ ミドルウェア(前)
コントローラー
アクションメソッド
↓ ⇦ ミドルウェア(後)
レスポンス
↓ ⇦ ビューコンポーザ
レンダリング※ページの表示
middlewareの使用例
あくまでも一例ですが、ミドルウェアの使用例のイメージをつけて、ミドルウェアについて学んでいきましょう。
- 認証チェックを行うミドルウェア
- アクセスログを残すミドルウェア
- IP制限チェックを行うミドルウェア
スポンサードサーチ
middlewareを使用するためにする4つのこと
middlewareを使用するためにすることは、次の4つを行う必要があります。
- App/Http/Middleware配下にミドルウェアを作成
- app/Http/Kernel.phpにミドルウェアをHTTPカーネルに登録
- routes/web.phpにルートを定義
- Controllerでミドルウェアを使用
middlewareの作成
php artisan make:middleware ミドルウェア名
コマンドを叩くとミドルウェアファイルが作られます。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class hogeMiddleware
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
return $next($request);
}
}
スポンサードサーチ
kernel.phpへmiddlewareの登録
作成したmiddlewareを「Kernel.php」登録します。
middlewareをHTTPカーネルに登録します。
App名/app/Http/Kernel.php
Kernel.php
ファイルにミドルウェアを定義することで、
アプリケーション全体でのリクエストの処理や特定の機能に対する処理を管理しやすくなります。
ミドルウェアは、リクエストの前処理や後処理、認証、ログ記録など、さまざまなタスクに使用されます。
Kernel.php
ファイルとは?
Kernel.php
ファイルは、Laravelアプリケーションの中核となるクラスであり、アプリケーションの、
HTTPリクエストを処理するための中央処理の機能を提供します。
全てのリクエストに対して実行されるグローバルなミドルウェアを定義するための場所です。
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array<int, class-string|string>
*/
protected $middleware = [
// \App\Http\Middleware\TrustHosts::class,
\App\Http\Middleware\TrustProxies::class,
\Illuminate\Http\Middleware\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\HogeMiddleware::class, // 追加
];
$middlewareへミドルウェアを追加する
middleware
プロパティは、HTTPカーネルでグローバルに適用されるミドルウェアを定義します。
このプロパティに指定されたミドルウェアは、アプリケーション内のすべてのリクエストに適用されます。
protected $middleware = [
\App\Http\Middleware\HogeMiddleware::class
\App\Http\Middleware\HogeMiddleware::class, // 追加
]
スポンサードサーチ
$middlewareについての説明
TrustProxies
\App\Http\Middleware\TrustProxies::class
プロキシを信頼するためのミドルウェアです。
HTTPSリクエストに対して適切なプロキシ設定を行います。
HandleCors
\Illuminate\Http\Middleware\HandleCors::class
CORS(Cross-Origin Resource Sharing)の設定を処理するためのミドルウェアです。
異なるオリジンからのリクエストに対する制御を行います。
PreventRequestsDuringMaintenance
\App\Http\Middleware\PreventRequestsDuringMaintenance::class
メンテナンスモード中にアプリケーションへのリクエストを制御するためのミドルウェアです。
メンテナンスモードの際に、指定されたIPアドレスからのリクエストのみを許可します。
ValidatePostSize
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class
POSTリクエストのサイズを検証するためのミドルウェアです。
大きなデータが送信されるのを防ぎます。
TrimStrings
\App\Http\Middleware\TrimStrings::class
リクエストの文字列データから先頭および末尾の余分なスペースをトリミングするためのミドルウェアです。
ConvertEmptyStringsToNull
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class
空の文字列をNULLに変換するためのミドルウェアです。
データベースに保存する前に文字列の正規化を行います。
これらのミドルウェアは、全てのリクエストに適用されるため、アプリケーション全体の動作やセキュリティの側面をカスタマイズするために重要です。
アプリケーションの特定のニーズに合わせてこれらのミドルウェアをカスタマイズすることができます。
middlewareGroups
特定のルートグループやルート属性に適用されるミドルウェアのグループを定義するためのものです。
web
: このグループは、WebアプリケーションのHTTPセッションやCSRF保護などのミドルウェアを含みます。api
: このグループは、外部APIと通信する場合に使用されるミドルウェアを含みます。
/**
* The application's route middleware groups.
*
* @var array<string, array<int, class-string|string>>
*/
protected $middlewareGroups = [
'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' => [
// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
\Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
$middlewareGroupsへミドルウェアグループを追加する
$middlewareGroups
にはリクエストの種類ごとの設定が配置されます。
protected $middlewareGroups = [
'web' => [
// 省略
],
'api' => [
// 省略
,
'hoge' => [ // 追加
\App\Http\Middleware\HogeMiddleware::class
]
]
EncryptCookies
\App\Http\Middleware\EncryptCookies::class
クッキーを暗号化するためのミドルウェアです。セッションのクッキーが安全に扱われるようにします。
AddQueuedCookiesToResponse
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class
キューに登録されたクッキーをレスポンスに追加するためのミドルウェアです。
StartSession
\Illuminate\Session\Middleware\StartSession::class:
セッションを開始するためのミドルウェアです。セッションデータの読み書きが可能になります。
ShareErrorsFromSession
\Illuminate\View\Middleware\ShareErrorsFromSession::class
セッションからエラーメッセージをビューに共有するためのミドルウェアです。
VerifyCsrfToken
\App\Http\Middleware\VerifyCsrfToken::class
CSRFトークンを検証するためのミドルウェアです。クロスサイトリクエストフォージェリ対策として使用されます。
SubstituteBindings
\Illuminate\Routing\Middleware\SubstituteBindings::class
ルートモデルバインディングを行うためのミドルウェアです。
コントローラメソッド内でモデルを取得できるようにします。
$middlewareGroupsのapi
ThrottleRequests
\Illuminate\Routing\Middleware\ThrottleRequests::class.':api'
APIリクエストのレートリミットを設定するためのミドルウェアです。APIへの過度なリクエストを制御します。
SubstituteBindings
\Illuminate\Routing\Middleware\SubstituteBindings::class
ルートモデルバインディングを行うためのミドルウェアです。
WEBとAPIでも同様にモデルを取得できるようにします。
middlewareAliasesまたはrouteMiddleware
$middlewareAliasesまたは$routeMiddleware
routeMiddleware
プロパティは、ルート定義で使用されるカスタムミドルウェアのエイリアスを定義します。これにより、ルートで特定のミドルウェアを参照する際に、ミドルウェアクラスの完全修飾名ではなくエイリアスを使用できます。
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array<string, class-string|string>
*/
protected $middlewareAliases = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::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' => \App\Http\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
もう少し補足します。
ルートで一つずつ定義しなくてもrouteMiddlewareで定義しておけば、ミドルウェアを呼び出す際に簡単に行えます。
routeMiddlewareでルート定義
routeMiddlewareではルートで使用するミドルウェアを配列にまとめることができます。
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'authA' => \App\Http\Middleware\AuthenticateA::class,
'authB' => \App\Http\Middleware\AuthenticateB::class,
'authC' => \App\Http\Middleware\AuthenticateC::class,
]
routeMiddlewareにまとめて書くことで、ミドルウェアの実行も簡潔に書くことができます。
public function __construct()
{
$this->middleware('auth');
$this->middleware('authA');
$this->middleware('authB');
$this->middleware('authC');
}
ルート毎にミドルウェアを実行
routeMiddlewareを使わない場合は、一つずつミドウェアを同じルートに記述することになります。
Route::middleware('auth')->get('/user', function (Request $request) {
return $request->user();
});
Route::middleware('authA')->get('/user', function (Request $request) {
return $request->user();
});
Route::middleware('authB')->get('/user', function (Request $request) {
return $request->user();
});
Route::middleware('authC')->get('/user', function (Request $request) {
return $request->user();
});
auth
'auth' => \App\Http\Middleware\Authenticate::class
ユーザーの認証状態をチェックするためのミドルウェアです。例えば、'auth'
ミドルウェアをルートに適用すると、認証されていないユーザーはログインページにリダイレクトされます。
auth.basic
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
ベーシック認証(Basic Authentication)を使用してユーザーを認証するためのミドルウェアです。HTTPのヘッダーを使用して認証情報を送信し、認証を行います。
auth.session
'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
セッションを使用してユーザーを認証するためのミドルウェアです。ユーザーがログインしたセッション内で認証を保持します。
cache.headers
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class
レスポンスのキャッシュヘッダーを設定するためのミドルウェアです。キャッシュを適切に制御するために使用されます。
can
'can' => \Illuminate\Auth\Middleware\Authorize::class
ユーザーの権限をチェックし、特定のアクションやリソースへのアクセスを制御するためのミドルウェアです。
guest
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class
ゲストユーザー(未認証のユーザー)が特定のリソースにアクセスできるかどうかをチェックするためのミドルウェアです。
password.confirm
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class
重要なアクションの前に、ユーザーにパスワードの確認を求めるためのミドルウェアです。
signed
'signed' => \App\Http\Middleware\ValidateSignature::class
URLに署名を追加してセキュアなリンクを生成するためのミドルウェアです。
throttle
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class
リクエストの制限をかけて過剰なリクエストの送信を制御するためのミドルウェアです。
verified
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class
ユーザーのメールアドレスが確認済みであるかどうかをチェックするためのミドルウェアです。
$middlewareAliasesはミドルウェアの名前を短縮したエイリアス(別名)として定義するためのプロパティです。
ミドルウェアを使用する際に、長いクラス名を代わりに短縮された名前で指定するために利用されます。
「auth」エイリアスで「\App\Http\Middleware\Authenticate::class」が呼ばれます。
Route::middleware('auth')->group(function () {
// ミドルウェアが適用されたルート
});
middlewareGroupsの作成例
middlewareのコマンド作成
artisanコマンドでmiddlewareを作成します。
php artisan make:middleware CustomAuthMiddleware
middlewareのクラスを編集
artisanコマンドでmiddlewareを作成したクラスを編集します。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class CustomAuthMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
// ログインしているかどうかを確認するために、Auth ファサードを使用します。
if (Auth::check()) {
// ログインしている場合は、次のミドルウェアにリクエストを進めます。
return $next($request);
}
// ログインしていない場合は、リダイレクトなどの適切な処理を行います。
return redirect()->route('login');
}
}
Kernel.phpに記述
Kernel.phpにmiddlewareを記述します。
protected $middlewareGroups = [
'web' => [
// 他のミドルウェア省略
\App\Http\Middleware\CustomAuthMiddleware::class,
],
'api' => [
// 他のミドルウェア省略
],
];
middlewareにエイリアスを使う
middleware のエイリアスを使用するには、プロパティを使用してミドルウェアにエイリアスを割り当てます。
protected $routeMiddleware = [
// ミドルウェア例
'custom_auth' => \App\Http\Middleware\CustomAuthMiddleware::class,
]
middlewareAliasesまたはrouteMiddlewareへミドルウェアを追加する
エイリアス名とアローでパスを指定します。
protected $middlewareAliases = [
'hogeOne' => \App\Http\Middleware\HogeOneMiddleware::class
'hogeTwo' => \App\Http\Middleware\HogeTwoMiddleware::class
]
web.phpのルートにミドルウェアのエイリアスを追加する方法
ルートの定義でミドルウェアを使用することで、ルートの実行時にミドルウェアが呼ばれます。
middlewareでエイリアスを使った例は以下のようなイメージになります。
Route::middleware('custom_auth')->get('/example', function () {
// ここにルートの処理を記述します。
});
エイリアスをグループを使って middlewareを作成することもできます。
Route::middleware('auth')->group(function () {
// ここに 'auth' ミドルウェアが適用されるルートを定義します。
Route::get('/dashboard', 'DashboardController@index');
Route::get('/profile', 'ProfileController@show');
// 他のルートも同様に追加します。
});
$middlewareGroupsと$routeMiddlewareはweb.phpへ記述してください。
middleware
Route::get('/hoge', function () { return view('hoge'); })->middleware('グループ名');
複数のmiddleware
Route::get('/hoge', function () { return view('hoge'); })->middleware(['hogeOne','hogeTwo']);
groupのmiddleware
Route::group(['middleware' => ['hogeOne']], function () {
Route::get('/a', function () { return view('a'); });
Route::get('/b', function () { return view('b'); });
});
Route::group(['middleware' => ['hogeTwo']], function () {
Route::get('/c', function () { return view('c'); });
Route::get('/d', function () { return view('d'); });
});
Controllerでミドルウェアを使用する
Kernel.php
に定義されているミドルウェアは、コントローラのコンストラクタで「$this->middleware
」を使用して呼び出すことができます。
エイリアスを使ったミドルウェア
/**
* Controller constructor.
*/
public function __construct()
{
$this->middleware('custom_auth');
}
constructが実行されたタイミングで、ミドルウェアが呼ばれます。
エイリアスを使わずにミドルウェアを直接定義
エイリアスを使わずに直接使うこともできます。
/**
* Controller constructor.
*/
public function __construct()
{
// ミドルウェアを直接指定
$this->middleware(\App\Http\Middleware\CustomMiddleware::class);
}
エイリアスを使った方が可動性が上がるのでおすすめします。
実装やエラーが解決できない場合
プログラミングの実装やエラーでどうしてもわからない場合はメンターに相談するのが一番です。
考えている、見えている範囲が狭くなり、解決から遠くに行って何時間も、何日も経っていることなんてよくある話です。
そういう時は聞ける先輩や、メンターに相談することが大事です。
僕にも相談可能なので気軽に相談してください。
Twitterからの連絡だと確実ですよ。
オンラインスクールやプログラミングスクールといったプログラミングを学べる方法もあるので、そちらもぜひ活用してもいいと思います。
Web開発で分からない時
オンライン完結型スクール DMM WEBCAMP PROアプリ開発で分からない時
プログラミング×稼げる副業スキルはテックキャンププログラミングについて分からない時
【コエテコ様限定】※ご案内を受けた以外のメディアが使用しても成果は承認されません。僕への個人でもメンターでも、スクールでもお好きな方を活用ください。