Laravelのミドルウェアが何か分からなくてまとめた

みなさんこんにちは、WEB制作のエンジニアのjonioです。

業務でLaravelを使う会社に所属したのですがその内私もLaravelを使う事になるので自分で学習中です。

ログイン用にBreezeを使ったのですがその時にルーティング(web.php)に↓の記述が追加されていました。

3行目に「middleware」と記載があり「これはミドルウェアだな〜」と思ったのですが何か分からないので自分なりに調べたので記事にしましたが今回Breezeがミドルウェアを含むのでログイン認証の内容です。

 

ミドルウェアって何?

誰か(クライアント)がどこかのURLにアクセス(リクエスト)した時にそのページを見る事ができるまでの通常の流れは「ルーティング→コントローラー(→モデル→データベース→コントローラー)→ビュー」の順になります。

ルーターはコントローラーに対して指示を出しますがそこに割り込んで別の事をさせるプログラムがミドルウェアです。

用途は色々とあると思いますが例えば何かを表示する時にワンクッション挟むものです。

ミドルウェアを通過する事ができればコントローラーに指示が伝わります。

江戸時代で例えるとどこかに旅に行く時に途中の関所で「通行手形を見せろ」と言われる感じで通行手形がミドルウェアです。

 

ミドルウェアは自作可能

Breezeをインストールするとミドルウェアは「Laravelのプロジェクト > app > Http > Middleware」にあります。

ログイン認証のミドルウェアは「Authenticate.php」です。

もし自作する場合は「php artisan make:middleware ミドルウェア名」と入力すれば作成できます。

ミドルウェア名は先頭の文字を「Custom」とか「SelfMiddleware」とかの大文字にします。

そして「Laravelのプロジェクト > app > Http > Kernel.php」に登録すればルーティング(web.php)かコントローラー(〜Controller.php)で使うことができます。

一旦Kernerl.phpの中を見てみます。

16行目〜24行目は全てのコントローラーで使うミドルウェアが登録されていてグローバルミドルウェアと言います。

10行目に「global」と記載があるのを確認できます。

31行目〜47行目はルーターごとにミドルウェアをまとめることができグループミドルウェアと言います。

57行目〜65行目ですがミドルウェアに名前を付ける事ができます。(「auth」や「auth.basic」や「cache.headers」とかです)

 

ミドルウェアの使い方

Breezeをインストールした時点でログイン認証のミドルウェア「Authenticate.php」が作成されますが今回はそれを「php artisan make:middleware Authenticate」で自作したとします。

すると「Laravelのプロジェクト > app >Http > Middleware」に「Authenticate.php」が作成されます。

Authenticate.phpですが自作した場合はファイルの中身は↓になります。

ですが今回はBreezeをインストールした時に作成されたAuthenticate.phpのファイルの中身で話を進めます。

ミドルウェアは「コントローラー」と「ルーター」での使い方がありますがそれぞれ見ていきます。

 

コントローラーで使う場合

コントローラーでミドルウェアを使う場合はページを表示するコントローラーで使います。

わざとトップページを表示する時にログイン画面が表示されるようにしますがコントローラーの記述の上に追記します。

14行目の「auth」はミドルウェア名ですが「Laravelのプロジェクト > app > Http > Kernel.php」に記載があります。

これでトップページに移動するとログインの画面になります。

このやり方には欠点があってログインの場合はいいのですが例えば記事を読むサイトがあったとしてログインしている人のみ記事の作成・編集・削除ができるようにしたい場合だと記事を読む場合もログインしないといけなくなります。

そうしない為に記事を読む場合はログインをしなくていいようにログインになる場合の指定をします。

↓のコードに変えます。

15行目は「[‘create’, ‘store’,’edit’,’update’,’destroy’]」など状況に応じて変えます。

次はルーターです。

 

ルーターで使う場合

web.phpのコードに追記します。

23行目にメソッドチェーンで「->name(‘dashboard’)」の前に「->middleware(‘auth’)」を付ける事でトップページに移動した時にログイン画面に移動します。

「auth」はコントローラーでミドルウェアを使った時と同じでミドルウェア名です。