こんなときに使う
ページ見に来た。
リクエストの情報を使って、コントローラーを動かしたいけど、
コントローラーを動かす前にちょっとデータを操作したい。
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は便利。
参考
また例によって、公式ドキュメント。