Laravel ミドルウェア(middleware)

作成日:2019-03-29, 更新日:2023-09-20

基本

ルーティングのタイミングで何かしてくれるのがミドルウェア。
その後、コントローラーやビューに遷移。

ミドルウェアの設定関連

・「app\Http\Kernel.php」で指定されている
・「app\Http\Kernel.php」の「$middleware」は全処理で実行
・「app\Http\Kernel.php」の「$middlewareGroups」「$routeMiddleware」はルーティング時に指定されれば実行
・各ミドルウェアの「handle(){}」が実行されているっぽい
・各ミドルウェアの「handle(){}」の中で「$next($request);」が「次のミドルウェアを実行」という処理
※「$middlewareGroups」は「app\Providers\RouteServiceProvider.php / mapWebRoutes()、mapApiRoutes()」で指定されている

アクセスがときのmiddlewareの流れ

アクセスがあった場合、「app\Http\Kernel.php」内のそれぞれの順番

  1. まず、「$middleware」を確認
  2. 次に「$middlewareGroups」の「web」または「api」を確認
  3. 最後に対象のルーティング設定に「Route::middleware(***)」があれば「$middlewareAliases」を確認

「app\Http\Kernel.php」内のそれぞれの記載順について

  • 「$middleware」の記載順は関係ある
  • 「$middlewareGroups」の記載順は関係ない
  • 「$middlewareAliases」の記載順は関係ない

ミドルウェアが実行される流れ

上から順に実行されるっぽい。

▼「app\Http\Kernel.php」のサンプル

protected $middleware = [
  mid01,
  mid02,
];

▼「app\Http\Middleware\mid〇〇.php」のサンプル

public function handle($request, Closure $next) {
  
  // 次のミドルウェア実行前の処理
  ~ 〇〇〇 ~
  
  // 次のミドルウェアを実行
  $res = $next($request);
  
  // (必要なら)次のミドルウェア実行後の処理
  ~ 〇〇〇 ~
  
  return $res;
}

※「$res = $next($request);」の前後で「ログインチェック」や「特定のヤツを拒否する」とか何かしてあげる

▼処理の流れ
1.「ミドルウェア:mid01」を実行
2.「ミドルウェア:mid01」が「ミドルウェア:mid02」を実行
3.「ミドルウェア:mid02」完了後、「ミドルウェア:mid01」に戻る

エラーにしたい

public function handle($request, Closure $next) {
  
  // 次のミドルウェア実行前の処理
  ~ 〇〇〇 ~
  
  if ( 条件 ) {
    return 'エラーメッセージ';
    // return view('〇〇〇'); // メッセージじゃなくviewを表示させる場合
  }
  
  // 次のミドルウェアを実行
  $res = $next($request);
  
  return $res;
}