Laravel 11では、bootstrap/app.php
ファイルを使用してミドルウェアグループにミドルウェアを追加する新しい方法が導入されています。
この方法を使うことで、アプリケーションの起動時にミドルウェアグループを簡単に設定できます。
今回はこの実装方法について解説します!
目次
ミドルウェアグループとは?
ミドルウェアグループとは、複数のミドルウェアを一つのグループにまとめて、それをルートやルートグループに適用するための機能です。
これにより、複数のルートで共通のミドルウェアのセットを簡単に再利用することができます。
ミドルウェアグループの利点
- 整理と管理の簡素化:
- 同じミドルウェアセットを複数のルートに適用する必要がある場合、それぞれのルートにミドルウェアを個別に指定する代わりに、一つのグループ名を指定するだけで済みます。
- 設定の一元化:
- ミドルウェアの変更が必要になった場合、グループ定義を更新するだけで、関連するすべてのルートに対する変更が適用されます。
- 適用の柔軟性:
- ミドルウェアグループは、特定のルートやルートグループに対して柔軟に適用することができ、状況に応じてミドルウェアを簡単に追加または削除することが可能です。
ミドルウェアを作って実践してみる
今回作る、ミドルウェアの仕様は以下になります。(ご自身のアプリケーション要件に合わせて内容は変えてください)
- 運営側から認証されたユーザーかどうかというのを判定し、認証されていなかったら申請ページにリダイレクトする
ミドルウェアの作成
コマンドを使って新しいミドルウェアを生成します。
php artisan make:middleware EnsureUserIsApproved
ミドルウェアの実装
生成されたミドルウェアファイルに以下のロジックを追加します。これはユーザーの承認ステータスをチェックし、未提出の場合は指定されたルートへリダイレクトします。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use App\Models\User;
class EnsureUserIsApproved
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
$user = $request->user();
if ($user && $user->approval_status === User::APPROVAL_STATUS_UNSUBMITTED) {
return redirect()->route('user.application');
}
return $next($request);
}
}
ミドルウェアグループにミドルウェアを追加する
bootstrap/app.php
に記述していきます。
$app->withMiddleware()
メソッドを使用して、必要なミドルウェアを特定のグループに追加します。
appendToGroup
はグループの最後にミドルウェアを追加し、prependToGroup
はグループの最初にミドルウェアを追加します。
今回は、approved
という名前のミドルウェアグループを追加します。
$middleware->appendToGroup('approved', [
EnsureUserIsApproved::class,
]);
全文は以下になります。
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use App\Http\Middleware\EnsureUserIsApproved;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__ . '/../routes/web.php',
commands: __DIR__ . '/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$middleware->web(append: [
\App\Http\Middleware\HandleInertiaRequests::class,
\Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets::class,
]);
$middleware->appendToGroup('approved', [
EnsureUserIsApproved::class,
// 他にミドルウェアがあれば追加
]);
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
これでミドルウェアグループの追加が完了しました!
ミドルウェアグループを使う
ミドルウェアグループは、個々のミドルウェアと同じ構文を使用して、ルートとコントローラアクションに割り当てることができます。
Route::get('/', function () {
// ...
})->middleware('group-name');
Route::middleware(['group-name'])->group(function () {
// ...
});
今回作ったミドルウェアグループを使ってみます。
Route::middleware('auth', 'verified', 'approved')->group(function () {
Route::get('/dashboard', [UserController::class, 'dashboard'])->name('dashboard');
});
これで、ミドルウェアグループが適用されました!🎉
参考
https://laravel.com/docs/11.x/middleware#middleware-groups