Laravelでミドルウェアを使ってみます。
フレームワークを設計する際に、度々、共通処理をどこに設置するのかということで悩みます。
先日もLaravel初心者の私がLaravelを設計しているときに、全ページで共通の処理を実行したいのだけどどうしよう?と調べていたらミドルウェアの情報にたどり着きました。
基本的にLaravelはMVCアーキテクチャを採用しているのですが、各リスエストを処理するコントローラとは別に、ミドルウェアというプログラムを用意して任意のリクエストに対して同じ処理を実行するしくみが用意されてるようです。
例えば、
- 任意のチェック処理を一部リクエストに対して実行したい場合
- 全ページに対して任意のデータを埋め込みたい場合
など、ミドルウェアとしてプログラムを用意して、好きなところに組み込むことができます。
ミドルウェアの新規作成
まずはミドルウェアを新規作成します。
ミドルウェアの作成は、自身でクラスファイルを用意してコードを記述してもよいですが、Laravelでは以下の便利なコマンドが用意されています。
> php artisan make:middleware SampleMiddleware
コマンドを実行すると、自動で以下のファイルが生成されます。
/app/Http/Middleware/SampleMiddleware.php
ファイルの中味は以下の通りです。
namespace App\Http\Middleware; use Closure; class SampleMiddleware { public function handle($request, Closure $next) { return $next($request); } }
今回内容解説については割愛しますが、このファイルをベースにプログラムを開発します。
ミドルウェアを任意のリクエストに対して実行する
用意したミドルウェアを実行するためには、カーネル「/app/Http/Kernel.php」に登録しなければ使用できません。
「Kernel.php」の変数「$routeMiddleware」に先ほど生成した「SampleMiddleware.php」を追記します。
protected $routeMiddleware = [ … 'sample' => \App\Http\Middleware\SampleMiddleware::class,
次に、どのリクエストに対して登録したミドルウェアを実行するかといったことを「/routes/web.php」に記述します。
例えば「/sample/」というパスに対してミドルウェア「sample」登録する場合は、以下のようにしてルート設定に対してメソッドチェーンを追記します。
Route::get('/sample', 'SampleController@index'); ↓ Route::get('/sample', 'SampleController@index')->middleware('sample');
ちなみに以下のようにミドルウェアは複数実行できます。
Route::get('/sample', 'SampleController@index')->middleware('sample')->middleware('sample1')->middleware('sample2');
ミドルウェアを全てのリクエストに対して実行する
用意したミドルウェアを全てのリクエストに対して実行するためには「Kernel.php」の変数「$middleware」にミドルウェアを追記します。
protected $middleware= [ … 'sample' => \App\Http\Middleware\SampleMiddleware::class,
この場合「/routes/web.php」にメソッドチェーンを記述しなくても、全てのリクエストに対して登録したミドルウェアが実行されるようになります。
コメントする