初心者向け!Laravelミドルウェアの基本と作成方法

初心者向け!Laravelミドルウェアの基本と作成方法

こんにちは!

今回はLaravelのミドルウェアについて解説していきます。

ミドルウェアを使うことで、リクエストに対して処理を行う前後になんらかの処理を差し込むことができます

本記事を読めば、Laravelを使ったミドルウェアの基本と具体的な作成方法について知ることができます。

ぜひ、最後まで読んでみてください。

ミドルウェアとは?

ミドルウェアとは、リクエストとレスポンスの間に介在するソフトウェアのことです。

サーバーがクライアント側からリクエストを受けた際に、本処理を実行する前になんらかの操作を行いたい場合や、レスポンスを返す前になんらかの処理を差し込みたい場合などに作成します。

例えば、認証チェックのミドルウェアを作成すると、Laravelで処理する前に認証を通過していないユーザーはログイン画面に戻す、といったことを行うことができるようになります。

ミドルウェアの作成

それでは、具体的にLaravelでどのようにミドルウェアを作成するのかについて見ていきます。前提として、本記事ではLaravel9系を使っています。

ミドルウェアのファイルは以下のコマンドから作成することができます。

$ php artisan make:middleware [ミドルウェアのファイル名]

ミドルウェアのファイルは「app/Http/Middleware」ディレクトリ配下に作成されます。

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;

class ミドルウェア名{
  /**
   * Handle an incoming request.
   *
   * @param  \Illuminate\Http\Request  $request
   * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
   * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
   */

  public function handle(Request $request, Closure $next)
  {
    // リクエストの前に処理したい内容を書く
    $response = $next($request);
    // レスポンスの前に処理したい内容を書く
    return $response;
  }
}

$response = $next($request);の行の前に書けば、リクエストの前に処理したい内容を書くことができ、後に書けばリクエストが到達しLaravelの処理が実行された後に処理したい内容を書くことができます。

ミドルウェアの登録

ミドルウェアファイルを作成しただけでは、残念ながらミドルウェアは機能しません。ミドルウェアをLaravelアプリケーションに登録する必要があります

ミドルウェアの登録方法は以下の3つあります。

  1. グローバルミドルウェア
  2. ルートミドルウェア
  3. ミドルウェアグループ

どの方法で登録するかはシステムの要件によって異なります。一番適切な方法を選択しましょう。

それでは、順番に見ていきましょう。

グローバルミドルウェア

グローバルミドルウェアは、全てのリクエストについてミドルウェアを差し込む方法です。

「app/Http/Kernel.php」ファイルの$middlewareプロパティにミドルウェアクラスを追加します。

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/Kernel.php」ファイルの$routeMiddlewareプロパティにミドルウェアクラスを追加します。

protected $routeMiddleware = [
  '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,
  'キー名' => [ミドルウェアクラス名] // 追加
];

次に、ルーティングで指定したミドルウェアのキー名で特定のルートにミドルウェアを割り当てます。

// routes/web.php
Route::get('パス名', ...)->middleware('キー名');

これで、特定のルートのみにミドルウェアを動作させることができます。

ミドルウェアグループ

複数のミドルウェアを1つのキーでグループ化して割り当てることもできます。

今回は例として、webミドルウェアグループにミドルウェアを登録してみます。

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,
    [ミドルウェアクラス名]
  ],
  ...
];

webミドルウェアグループに登録したので、ルーティングでの設定時は「web」というキー名でミドルウェアを適用することができます。

// routes/web.php
Route::get('パス名', ...)->middleware('web');

次のように、複数のルートに対して一度に設定することもできます。

// routes/web.php
Route::middleware(['web'])->group(function() {  //});

ミドルウェアの実践例

最後に、ミドルウェアの実践例を見ていきます。

ここでは例として、ルートパラメータのバリデーションを行うミドルウェアを作成してみます。

$ php artisan make:middleware ValidateRouteParameter

ミドルウェアのファイルが作成されるので、以下のように編集します。

namespace App\Http\Middleware;
use Closure;use Illuminate\Http\Request;

class ValidateRouteParameter{
  /**
   * Handle an incoming request.
   *
   * @param  \Illuminate\Http\Request  $request
   * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
   * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
   */
  public function handle($request, Closure $next)
  {
    if (!is_numeric($request->route('id'))) {
      return redirect('error');
    }
    return $next($request);
  }
}

次に、ミドルウェアの登録を行います。今回は、ルートミドルウェアに登録します。

protected $routeMiddleware = [
  // その他のミドルウェア
  'validate.param' => \App\Http\Middleware\ValidateRouteParameter::class,
];

最後に、ルートへ適用します。

use Illuminate\Support\Facades\Route;

Route::get('profile/{id}', function ($id) {
  // プロフィール表示ロジック
  return "ユーザープロフィール: {$id}";
})->middleware('validate.param');

エンドポイントのパスパラメータであるIDが、もし数値ではない場合はエラーとなり、エラーのビューにリダイレクトされるようになっています。

まとめ

それでは内容をまとめます。

ミドルウェアというのは、リクエストからレスポンスまでの間に処理を差し込むことができるソフトウェアのことでした。

また、ミドルウェアは以下のような手順で作成することができます。

  1. ミドルウェアファイルの作成
  2. ミドルウェアファイルの編集
  3. ミドルウェアクラスの登録

そして、ミドルウェアの登録方法は以下の3つがありました。

  • グローバルミドルウェア
  • ルートミドルウェア
  • ミドルウェアグループ

どの登録方法で実装するかは要件によって適切なものを選びましょう。

最後まで読んでいただき、ありがとうございました。