ミドルウェアとは
ミドルウェアとは何かを解説する題材として、「あるURLでのリクエスト処理に対しては、常に接続元のIPアドレスを記録しておく」といった仕様を考えてみます。
例えば、システムの管理者のみが実行できる機能が/management/以下のURLパターンにまとまっているとします。例として、そのシステムを利用するユーザを追加する機能のURLだと、/management/users/addUserといったものが考えられます。これらの/management/以下のURLにアクセスしてきた場合は、常に接続元のIPアドレスをDBに記録するようにします。
その場合、どのようなソースコードが考えられるでしょうか。これは、以下のように、このURLパターンを登録したルーティングコールバック関数内の最初にその記録処理を記述するものです。
Route::post("/management/users/addUser", function() { ここにIPアドレスの記録処理を記述 : });
あるいは、前回解説したコントローラクラスを使用するならば、以下のように該当するメソッドの最初に同じように記述します。
class UsersController extends Controller { public function addUser() { ここにIPアドレスの記録処理を記述 : } : }
とはいえ、該当するすべてのコールバック関数やコントローラクラスメソッドに同じ処理を記述するのは効率が悪いので、通常は、IPアドレスの記録処理を行う関数、あるいはメソッドを作成して、それを呼び出すコードを記述します。すると例えば、以下のコードとなります。
class UsersController extends Controller { public function addUser() { Functions::recordIPAddress(…); : } : }
ここで呼び出しているrecordIPAddress()は、Functionsクラスに記述されたIPアドレスの記録処理メソッドです。これで、比較的メンテナンスしやすいコードになります。それでも、この1行を、該当するすべてのコントローラクラスメソッドに記述する必要があり、記述し忘れるとそれはバグとなります。
このように、コールバック関数やコントローラクラスメソッドに記述する本来の処理(リクエスト処理)に先んじて何か定型的な処理を行う必要があるケースは、Webアプリ、Webシステムではよくあることです。こういった時に活用できる機能として、Laravelにはミドルウェアがあります。ミドルウェアは、リクエスト処理の前後に処理を挿入できる機能です(図1)。