イントロダクション

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;

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);
    }

}

ご覧の通り、age200以下の場合、ミドルウェアはHTTPリダイレクトをクライアントへ返します。そうでなければ、リクエストはパスし、アプリケーションの先へ進めます。ミドルウェアのチェックに合格し、アプリケーションの先へリクエストを通すには、$requestを渡した$nextコールバックを呼び出すだけです。

ミドルウェアを把握する一番よい方法は、HTTPリクエストがアプリケーションに届くまでに通過する、数々の「レイヤー(層)」だと考えてください。それぞれのレイヤーは、リクエストをテストし、完全に破棄することさえあるでしょう。

ミドルウェア登録

グローバルミドルウェア

あるミドルウェアをアプリケーションの全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 Illuminate\Contracts\Routing\TerminableMiddleware;

class StartSession implements TerminableMiddleware {

    public function handle($request, $next)
    {
        return $next($request);
    }

    public function terminate($request, $response)
    {
        // Store the session data...
    }

}

ご覧の通り、handleメソッドの定義に加えて、TerminableMiddlewareterminateメソッドを定義しています。このメソッドは、リクエストとレスポンスの両方を受け取ります。terminableなミドルウェアを定義し終えたら、HTTPカーネルの中の、グローバルミドルウェアのリストに、付け加える必要があります。。