Laravelでのミドルウェアメモ
ミドルウェアとは
リクエストがコントローラーのアクションに届く前後に処理をさせることができます。 指定のアドレスにリクエストが送られてきたら、自動的に何らかの処理を行う機能です。
ミドルウェアを作成する
ミドルウェアは以下のコマンドで作成できる。
php artisan make:middleware MyMiddleware
作成したファイルはapp/Http/Middleware
に作成されます。
<?php namespace App\Http\Middleware; use Closure; class MyMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { return $next($request); } }
使い方
リクエストで送られてきた値の$request
にミドルウェアで値を追加します。
◎app/Http/Middleware/MyMiddleware.php
class MyMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $data = [ ['name' => '佐藤', 'age' => 30], ['name' => '伊藤', 'age' => 40] ]; $request->merge(['data'=>$data]); return $next($request); } }
ミドルウェアをルートで呼び出します。
追加の仕方は、以下のようにメソッドチェーンとして設定することができます。
Route::get(...)->middleware()->middleware();
◎routes/web.php
Route::get('hello/', 'HelloController@index')
-> middleware(HelloMiddleware::class);
コントローラーでミドルウェアで追加した値を取得します。
◎app/Http/Controllers/MyController.php
class MyController extends Controller { public function index(Request $request) { return view('index', ['data'=>$request->data]); } }
Viewでミドルウェアで追加した値を表示します。
◎resources/views/index.blade.php
@foreach($data as $item) <span>{{$item['name']}}</span> <span>{{$item['age']}}</span> @endforeach
表示
佐藤 30 伊藤 40
前処理と後処理
$next(response)
の使い方で実行タイミングを制御することができます。
コントローラーの実行前の場合は
public function handle($request, Closure $next) { /* * ここに処理を実装する */ return $next($request); }
コントローラー実行後の場合は
public function handle($request, Closure $next) { $response = $next($request); /* * ここに処理を実装する */ return $response; }
後処理を試してみる
<hoge>
タグを<a>
タグに置き換える処理をミドルウェアの後処理で行ってみます。
◎app/Http/Middleware/MyMiddleware.php
class HelloMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $response = $next($request); // レスポンスに含まれるhtmlテキストを取得 $content = $response->content(); $pattern = '/<hoge>(.*)<\/hoge>/i'; $replace = '<a href="$1">$1</a>'; // テキストを置き換え $content = preg_replace( $pattern,$replace,$content); $response->setContent($content); return $response; } }
◎resources/views/index.blade.php
<hoge>http://google.com</hoge>
◎app/Http/Controllers/MyController.php
class MyController extends Controller { public function index(Request $request) { return view('index'); } }
表示
http://google.com
全てのアクセスでミドルウェアを実行してみる
全てのアクセスでミドルウェアを実行する場合は、app/Http/Kernel.php
に設定を追加します。 ここに登録することで、routeなどでミドルウェアを個別に指定する必要はなくなります。
protected $middleware = [ \App\Http\Middleware\CheckForMaintenanceMode::class, ... 省略 ... // ここに追加 ];
ミドルウェアのグループ化
複数のミドルウェアをまとめて定義することもできます。 app/Http/Kernel.php
の以下の箇所に追加します。
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, ... 中略 ... ], 'api' => [ 'throttle:60,1', 'bindings', ], // 追加する 'hoge' => [ \App\Http\Middleware\HelloMiddleware::class, //ミドルウェアを追加する ] ];
設定したミドルウェアグループをrouteで呼び出します。
◎routes/web.php
Route::get('hello/', 'HelloController@index')
-> middleware('hoge');