エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【Laravel】Controller等の動作前後に動くプログラム。Middleware【389日目】

こんなときに使う

ページ見に来た。

リクエストの情報を使って、コントローラーを動かしたいけど、
コントローラーを動かす前にちょっとデータを操作したい。

Viewの内容を毎回ちょっといじるとか。

毎回コントローラーに同じ処理をするとか面倒だしね。

どう書くの?

App\Http\Kernel.php

protected $routeMiddleware = [
    'xxxMiddleware' => \App\Http\Middleware\SomeMiddleware::class,
Route::get('/', function () {
    //
})->middleware('xxxMiddleware');

こんな感じに指定すると、該当のページに来たときに、処理が起こる前にMiddlewareが動く。

このMiddlewareが、いろいろリクエストを変えたり、
逆にコントローラーが作ったレスポンスのコンテンツを書き換えたりできる。

Middlewareの書き方

class SomeMiddleware
{
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
            // リダイレクト処理…
        }

        return $next($request);
    }

}

みたいなこと書ける。

class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // アクションを実行…

        return $response;
    }
}

こう書くと、コントローラーとかが動いたあとに、このMiddlewareが動く。

なにかの作業の前後にそれぞれ処理を入れたいときにMiddlewareは便利。

参考

また例によって、公式ドキュメント。

ミドルウェア 5.7 Laravel