Laravel5でMiddlewareを使う

Laravelのmiddlewareの使いどころは、デフォルトの機能でAuthがあるようにそんなようなところが使い所かと思います。デフォルトでは以下のような機能が備わっています。

  • メンテナンスモードかどうか判断するミドルウェア
  • Cookieの暗号化/復号化処理を行う機能
  • 指定されたCookieをResponseヘッダに登録する機能
  • Sessionの生成や取得などを行う機能
  • Sessionに保存されたエラー情報をViewにセットする機能
  • CSRFを防ぐためのトークンの発行やチェックを行う機能
  • Route Model Binding を実行する機能 (Laravel5.3から追加)

[Laravel]ミドルウェアを整理してLaravelを軽くする
ここらの機能は、

app/Http/Middleware/EncryptCookies.php
app/Http/Middleware/RedirectIfAuthenticated.php
app/Http/Middleware/TrimStrings.php
app/Http/Middleware/TrustProxies.php
app/Http/Middleware/VerifyCsrfToken.php

こんな感じでおいてあります。

つまるところ「いつも使うもの」をフロントコントローラではなくミドルウェアで設定しておくと便利ということになろうかと思います。

ミドルウェアの作成

artisanコマンドでミドルウェアのスケルトンを作成する。

php artisan make:middleware AdminMiddleware
Middleware created successfully.

app/Http/Middleware/AdminMiddleware.phpとして作成されます。

Kernel.phpに登録する

アプリケーション全体として利用する場合はKernel.phpに登録しておく必要があります。(そうではない場合は個別に呼び出すことになりますが、それやっちゃうとあんまりミドルウェアとしての醍醐味はないかもです。)
各所端折ってますが、

protected $middleware = [
    ...
    \App\Http\Middleware\AdminMiddleware::class,
];

protected $middlewareGroups = [
    'web' => [
        ...
        //\App\Http\Middleware\AdminMiddleware::class,
    ],
];

protected $routeMiddleware = [
    ...
    'admin' => \App\Http\Middleware\AdminMiddleware::class,
];

作成したミドルウェアを使えるようにしておきます。$routeMiddlewareでは”admin”というkeyで使えるようになります。( Authとかと同じですね。)
解説しすぎるとわかりずらくなりますが、$middlewareGroupsではリクエストの扱い、特にPOSTする際の挙動を一括してミドルウェアで扱えるように道具をひと束にしている箇所です。なので、今回新しく作成するミドルウェアがその挙動に関連するものなのかどうかというところでは未定なのでいったんコメントアウトしてます。
$middlewareや$routeMiddlewareでは単体で利用できるので登録しておいてOKでしょう。使い所によって扱いは変わってくるので上級者になったらいろいろ考えましょうね。

使い方

ミドルウェアはいろいろな使い方ができます。代表的なものは、

  • ルーティングでクロージャーとして使う
  • コントローラのコンストラクタで使う
  • 普通にメソッドとかプロパティーとして使う

です。ですが上記のKernelに登録することでリクエストのたびに自動的に実行されることになるので、気にしなくてもよいです。
実際に、app/Http/Middleware/AdminMiddleware.phpにechoしてみます。
middlewareはこのhandleメソッドが呼ばれます。

    public function handle($request, Closure $next)
    {
        echo "AdminMiddleware\n";
        return $next($request);
    }

これをやると、どのページにも等しく”AdminMiddleware\n”が表示されるはずです。
こりゃ楽だ。
ただミドルウェアの実行されるタイミングにふさわしい処理じゃないとだめだってことです。このタイミングというのがリクエストとレンスポンスの前後に関わること、という感じです。
いろんな処理の手前でやるので、なんでもかんでも自由に値を取得できるといったらそうでもないです。


http://laraweb.net/practice/1396/

Last update: 2018.01.06 (土)