以前からLaravel(ララベル)を使っていてわかりにくかったミドルウェアについてめも。
Laravelは一般的にはMVCフレームワークと言われていますが、コントローラーがリクエストを受け取り、何らかのアクションを起こすまで、あるいはアクションが起こってから、レスポンスを返すまでのレイヤー層の動きを「ミドルウェア」と言います。
基本的には全ページに共通な処理(認証)なんかをこれに入れると良さげ。全アクションの共通処理に使えます。
例えばフォームの値を受け取って、それをチェックすような仕組み、というものはコントローラーに書かずに別の部分が担当します。これがミドルウェアの働きです。
例えば認証の操作をする場合も、このミドルウェアが使われています。
*ちなみに自作することも可能です。参考文献を見て見ましょう。
独自ミドルウェアの作成
独自のmiddlewareを作成する場合、下記コマンドで自動生成できます。
1 2 3 |
php artisan make:middleware SampleMiddleware app/Http/Middlewareのなかに作成されています。 |
SampleMiddelware.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class SampleMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { //何らかの共通処理 return $next($request); } } |
グローバルミドルウェア
上記のように特定のページだけではなく全てのリクエスト(orレスポンス)時に動くミドルウェアがあり、これをグローバルミドルウェアと呼んでいます。
これを制御しているのがapp/Http/Kernel.phpです。
グローバルミドルウェアは通常だと下記のように定義されています。ここに登録されているものが共通で使われているミドルウェアです。一般的にはここに登録することが一般的のようです。
1 2 3 4 5 6 7 8 9 10 11 |
* These middleware are run during every request to your application. * * @var array */ protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, Middleware\SampleMiddleware::class ] |
ミドルウェアのグループ登録
多数のミドルウェアを使うようになると、複数のミドルウェアを一つにまとめて扱えるようにすると管理が楽になります。
ミドルウェアはグループとして扱うこともできます。
例えば下記のような記述はルーティングでwebと呼び出せば、列挙されているミドルウェアが全て使うことができるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/** * The application's route middleware groups. * * @var array */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], |
ミドルウェアの呼び出し(どのページで有効になるか?ルーティングの設定など)
実際に認証の際に、middlewareを呼び出す場合はrouting時に呼び出すことにします。認証のmiddlewareはauthで呼び出せます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Route::get('hello','HelloController@getIndex')->middleware('auth') //一般的にはルーティングはグルーピングされたものが多いと思うので下記のように使う Route::group(['middleware'=>'auth'],function(){ //このなかに有効となるルーティングがあり }) //ルーティングをグループで呼び出す場合+別のmiddlewareをセットで呼び出すのは下記のような感じ Route::group(['middleware'=>['auto','sample']],funcion(){ //このなかに有効となるルーティング }) //グルーピングされたmiddlewareを使う //webのなかのmiddlewareが一気に使用できる Route::group(['middleware'=>'web'], function(){ }) |
参考文献
PHP Laravelフレームワーク入門 P108〜