Masayan tech blog.

  1. ブログ記事一覧>
  2. Laravelのミドルウェアについて説明してみる

Laravelのミドルウェアについて説明してみる

公開日

ミドルウェアとは

コントローラクラスメソッドに記述する本来の処理(リクエスト処理)に先んじて何か定型的な処理

ミドルウェアの具体例

RedirectIfAuthenticatedのhandleメソッドには

「認証済み(ログイン済み)の状態でログインページにアクセスすると、ログイン後のトップページにリダイレクトする」処理が記載されています。

public function handle($request, Closure $next, $guard = null)
{
  if (Auth::guard($guard)->check()) {
  return redirect('/home');
}
return $next($request);
}

具体的には、認証しているかチェックして、認証していたらRouteServiceProvider::HOMEにリダイレクトしています。

...は可変長引数が指定されおり、任意の数だけ引数を渡すことができる。通常は一つの引数に対して一つのデータが渡された順に入る。可変長引数にすると、入力したデータをすべて渡すことができます。(引数の数が合わない!というエラーが出ないようになっています。

また、Authの実体はIlluminate\Auth\AuthManagerで、AuthManagerのguard()メソッドを実行するとSessionGuardインスタンスが作成されます

<SessionGuardインスタンス>

基本的に$guardsにはnullの配列が入り、カスタムガード(自前のguards)が必要な場合にnull以外の値が入る?(すみません。ここは実際に試したことがなく、あまり自信がないです)のかと思われます。そのため継続の処理であるAuth::guard($guard)->check()にてauth.phpにデフォルトで設定されている("web")のguardが入り、SessionGuardをcheckするとloggedOutの値がfalseなので、最終的にはログインしているかどうか、という検査に対してtrueが帰る仕組みになっています。

ミドルウェアの呼び出し

アプリケーションから Guard を呼び出すには、基本的に Auth ファサードを使用する必要があります。それ以外の guard を呼び出すには Auth::guard('api')->login() のように config/auth.phpに登録されているguard 名を指定する必要があります。

'defaults' => [
  'guard' => 'web',
  'passwords' => 'users',
],


'guards' => [
  'web' => [
    'driver' => 'session',
    'provider' => 'users',
  ],
  'api' => [
    'driver' => 'token',
    'provider' => 'users',
    'hash' => false,
  ],
],

ミドルウェアの登録方法

新規作成

以下のコマンドでミドルウェアが作成できます。作成したミドルウェアを有効にするには、app/Http/Kernel.phpに登録をする必要があります。

php artisan make:middleware ミドルウェア名

特定のページのみミドルウェアを適用

特定のページだけでミドルウェアを有効にしたい場合はapp/Http/Kernel.php$routeMiddlewareに登録します。

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,
];

全てのページでミドルウェアを適用

app/Http/Kernel.php内の$middlewareGroupsに作成したミドルウェアを登録することになります。

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,
  ],
];

どのルートにミドルウェアが適用されているか確認する方法

下記コマンドにより、ミドルウェア列に現在実装されている内容が表示されます。

php artisan route:list

例えば、RedirectIfAuthenticatedはapp/Http/Kernel.phpには

「guest」という名前で登録されており、guestが適用されているのは「/login」や「/register」などであることがわかります。

protected $routeMiddleware = [
  'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];

まとめ

いかがでしたでしょうか。本記事では、Laravelのミドルウェアについて説明しています。具体的には、ミドルウェアの定義・具体例・利用方法・登録方法・適用されているミドルウェアの確認の仕方等についてできる限りわかりやすく解説しています。特に認証の部分についてはミドルウェアは切っても切り離せない概念なので、ぜひ学習してみてください。