イントロダクション
HTTPミドルウェアはアプリケーションにやってきたHTTPリクエストをフィルタリングする、便利なメカニズムを提供します。例えば、アプリケーションのユーザーが認証されているかを確認するミドルウェアが、Laravelには用意されています。ユーザーが認証されていなければ、このミドルウェアはユーザーをログインスクリーンへリダイレクトします。反対にそのユーザーが認証済みであれば、アプリケーションへリクエストされたURLへ進むことを許可します。
もちろん、認証の他にも多彩なタスクを実行するミドルウェアを書くことが可能です。CORSミドルウェアはアプリケーションから返されるレスポンス全部に、正しいヘッダーを追加することに責任を持つことでしょう。ログミドルウェアはアプリケーションにやってきたリクエスト全部をログすることに責任を負うことでしょう。
メンテナンスや認証、CSRF保護など、
Laravelには多くのミドルウェアが含まれています。これらのミドルウェアは全部、app/Http/Middleware
ディレクトリーに設置されています。
ミドルウェア定義
新しいミドルウェアを作成するには、make:middleware
Artisanコマンドを使います。
php artisan make:middleware OldMiddleware
このコマンドにより、OldMiddleware
クラスが、app/Http/Middleware
ディレクトリー中に生成されます。このミドルウェアで、age
に200歳以上が指定された場合のみ、アクセスを許してみましょう。そうでなければ、ユーザーを"home"のURIへリダイレクトし、戻します。
<?php namespace App\Http\Middleware;
use Closure;
class OldMiddleware {
/**
* リクエストフィルターの実行
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->input('age') < 200)
{
return redirect('home');
}
return $next($request);
}
}
ご覧の通り、age
が200
以下の場合、ミドルウェアはHTTPリダイレクトをクライアントへ返します。そうでなければ、リクエストはパスし、アプリケーションの先へ進めます。ミドルウェアのチェックに合格し、アプリケーションの先へリクエストを通すには、$request
を渡した$next
コールバックを呼び出すだけです。
ミドルウェアを把握する一番良い方法は、HTTPリクエストがアプリケーションに届くまでに通過する、数々の「レイヤー(層)」なのだと考えることです。それぞれのレイヤーは、リクエストを通過させるかどうかテストし、場合により完全に破棄することさえあるでしょう。
BeforeとAfterミドルウェア
ミドルウェアがリクエストの前、後に実行されるかは、そのミドルウェア自身によります。次のミドルウェアはアプリケーションによりリクエストが処理される前に実行されます。
<?php namespace App\Http\Middleware;
use Closure;
class BeforeMiddleware implements Middleware {
public function handle($request, Closure $next)
{
// 実行コード
return $next($request);
}
}
一方、次のミドルウェアはアプリケーションによりリクエストが処理された後にタスクを実行します。
<?php namespace App\Http\Middleware;
use Closure;
class AfterMiddleware implements Middleware {
public function handle($request, Closure $next)
{
$response = $next($request);
// 実行コード
return $response;
}
}
ミドルウェア登録
グローバルミドルウェア
あるミドルウェアをアプリケーションの全HTTPリクエストで実行したい場合は、app/Http/Kernel.php
クラスの$middleware
プロパティへ追加してください。
ミドルウェアのルートへの登録
全てではなく、特定のルートに対しミドルウェアを指定したい場合は、先ずapp/Http/Kernel.php
ファイルでミドルウェアの短縮キーを登録します。デフォルト状態でこのクラスは、Laravelに含まれるミドルウェアのエントリーを$routeMiddleware
プロパティに含んでいます。自分のミドルウェアを追加する方法は、選んだキー名と共にリストへ付け加えるだけです。
HTTPカーネルへミドルウェアを定義し終えたら、そのmiddleware
キーをルートのオプション配列で指定できます。
Route::get('admin/profile', ['middleware' => 'auth', function()
{
//
}]);
終了前ミドルウェア
時には、HTTPレスポンスがブラウザに送られた後に、ミドルウェアが何かの作業を行う必要があることでしょう。例えば、Laravelに含まれている「セッション」ミドルウェアは、ブラウザにレスポンスを送った後、ストレージにセッションデーターを書き込こみます。そうするには、終了処理可能な(terminable)ミドルウェアとして定義してください。
use Closure;
use Illuminate\Contracts\Routing\TerminableMiddleware;
class StartSession implements TerminableMiddleware {
public function handle($request, Closure $next)
{
return $next($request);
}
public function terminate($request, $response)
{
// セッションデーターの保存...
}
}
ご覧の通り、handle
メソッドの定義に加えて、TerminableMiddleware
がterminate
メソッドを定義しています。このメソッドは、リクエストとレスポンスの両方を受け取ります。terminableなミドルウェアを定義し終えたら、HTTPカーネルの中の、グローバルミドルウェアのリストに、付け加える必要があります。