Laravel – middleware

概要

ミドルウェアを作成・登録する手順は以下のとおり

  1. artisanでミドルウェアを作成
  2. ミドルウェアの処理内容を記述
  3. ミドルウェアを登録
  4. ルーティングでミドルウェアの組み込みを設定

参考サイト:【Laravel】ルーティングのミドルウェアとは?作成手順と実例

準備

以下のルーティング、コントローラー、ビューを準備する。

ルーティング:

コントローラー:

ビュー:

なおコントローラーとビューで、以下のヘルパーコントローラーのconsole_log()メソッドで表示をさせていて、ミドルウェアでもこのメソッドを使っていく。

ミドルウェアの作成・登録手順

ミドルウェアの作成

以下のコマンドでミドルウェアのファイルを作成。

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

ファイルはapp/Http/Middlewareディレクトリー下に作成される(middlewareはuncountableだが、状況によってはmiddlewaresという複数形もあり得るらしい)。

作成されたファイルの内容。

ミドルウェアの処理内容の記述

ミドルウェアの処理には、その実行タイミングに応じた書き方がある。

それらについては後述するが、ここでは仮にhandle()メソッドに別途準備したconsole_log()で表示をさせている。

ミドルウェアの登録

登録の種類と手順

作成したミドルウェアはapp/Http/Kernel.phpファイルで登録する。

登録方法により、グローバル登録、ルーティング登録、グループ登録の3種がある。

グローバル登録

Kernelクラスの$middlewareプロパティーに作成したミドルウェアを加えると、すべてのルーティングにミドルウェアが適用される。

以下の例では、デフォルトで生成・登録されるミドルウェアに加えてSampleBeforeMiddlewareを登録している。

ルート登録

Kernelクラスの$routeMiddlewareプロパティーに、名前とともにミドルウェアを登録する。

以下の例では、デフォルトで生成・登録されるミドルウェアに加えて、SampleBeforeMiddleware'routed_middleware'という名前で登録している。

グループ登録

Kernelクラスの$middlewareGroupsプロパティーに、グループ名をキーとし、ミドルウェアの配列を値として登録する。

以下の例では、デフォルトで登録される2つのグループ'web''api'に加えて’test'というグループを追加し、そのグループにSampleBeforeMiddlewareを登録している。

ミドルウェアの適用

グローバル登録の場合は全適用

グローバル登録されたミドルウェアは、ルーティング設定がなくても全てのコントローラーのアクションに適用される。

この結果、アプリケーションの任意のURLにアクセスすると、ブラウザーのコンソールに以下の様に表示される。

ルーティングファイルでの適用

ルート登録・グループ登録のいずれの場合も、ルーティングで特定のルートにミドルウェアを適用できる。

ルートミドルウェアの場合は登録した名前で適用。

グループミドルウェアの場合は登録したグループ名で適用。

結果はいずれも同じで、以下のようにブラウザーのコンソールに表示される。

コントローラーのコンストラクターでの適用

コントローラーのコンストラクターの中で、middleware()メソッドの引数にミドルウェアの登録名やグループ名を指定して適用できる。

この場合、ルーティングファイルで設定しなくても、当該コントローラーのアクションに対してミドルウェアが適用される。

以下はルートミドルウェア名で登録する場合。

以下はグループ名で適用する場合。

結果はいずれも同じで、以下のようにブラウザーのコンソールに表示される。

ミドルウェアの条件

before middleware

コントローラーが呼ばれる前に実行すべき文を、$next($request)の実行より前に書く。

このとき、$requestからパラメーターを取り出し、その条件に応じた処理をさせることができる。

after middleware

handle()メソッド内で$next($request)を実行した後に、その結果に応じた処理を記述すると、コントローラーの実行後・ビュー表示前にその内容が処理される。

terminate()メソッド内に処理を記述すると、それらはビュー表示後に実行される。

ここで、この2つのミドルウェアをKernelクラスでグループ登録する。

ルーティングへの適用はグループ名で。

実行すると、ブラウザーのコンソールに以下の様に表示される。

なお、上記ではルーティングファイルでミドルウェアを適用したが、コントローラーのコンストラクターで適用しても結果は同じ。

only/except~部分指定と除外

準備

コントローラーのコンストラクターでミドルウェアを適用する場合、コントローラーの特定のアクションのみに適用したり、適用除外にしたりすることができる。

まず、以下のようなルーティング定義、コントローラーを準備する。ミドルウェアとビューはこれまで使ってきたものと同じ。

ルーティング:

コントローラー:

ここで2つのURLをブラウザーで指定すると、それぞれ以下の様に表示される。

middleware/select

middleware/ignore

only()~部分指定

コンストラクター内のmiddleware()に対してonly()メソッドを実行すると、引数の配列で与えたアクション群に対してだけミドルウェアが適用される。

以下の例ではselect()メソッドのみ適用対象としていて、ignore()メソッドにはミドルウェアは適用されない。

この結果、middleware/selectにアクセスした結果は先の結果と変わらないが、middleware/ignoreにアクセスした場合はミドルウェアが実行されず、以下のようなコンソール表示になる。

except()~除外指定

コンストラクター内のmiddleware()に対してexcept()メソッドを実行すると、引数の配列で与えたアクション群に対してだけミドルウェアが適用されなくなる。

以下の例ではignore()メソッドのみ適用除外となり、ミドルウェアが適用されない。

結果はonly()の場合と同じになる。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です