(Laravel) ミドルウェアの使い方を解説

(Laravel) ミドルウェアの使い方を解説

 

本記事では、
Laravelのミドルウェアについて使い方などを解説していく。

 

(Laravel) ミドルウェアとは

Laravelのミドルウェアとは、
リクエストを受け取るとコントローラ処理の前後に割り込み、独自の処理を追加する仕組みのことだ。アクションの処理が行われる前後に、ミドルウェアに指定した処理を実行する。

laravelのミドルウェアの画像

 

Laravelのミドルウェアの種類は3種類存在する

laravelのミドルウェアは3種類存在する。

ミドルウェア3種類
  1. 単体のミドルウェア
  2. グローバルミドルウェア
  3. グループのミドルウェア

 

ミドルウェアの3種類を順に説明していく。

 

①単体のミドルウェア

まずは単体のミドルウェアについて使い方などを解説していく。

 

ミドルウェア作成コマンド

最初にミドルウェアの作成コマンドから紹介。
ミドルウェアの作成コマンドは下記

# ミドルウェアの作成コマンド

php artisan make:middleware ◯◯Middleware

 

ミドルウェアは「make:middleware」というコマンドを使用して作成する。

通常、作成するミドルウェアの名前は「〇〇Middleware」の様にする(〇〇の部分は任意)。

 

ミドルウェアの配置場所

作成したミドルウェアはlaravelの下記の場所に配置される

#ミドルウェアの配置場所

app → Http → Middleware

 

作成初期のミドルウェアの状態は下記(HelloMiddlewareという名前で作成)

<?php

namespace App\Http\Middleware;
use Closure;
class HelloMiddleware

{

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */

    public function handle($request, Closure $next)
    {
        return $next($request);
    }

}

 

ミドルウェアの登録

ミドルウェアは作っただけでは動かない
作成したミドルウェアが動いてくれるように、登録する作業が必要である。

その際、
ミドルウェアの登録のために編集するファイルは「kernel.php」というファイルだ。

#kernel.phpの場所

app → Http → Kernel.php

 

kernel.phpの中にある、「$routeMiddleware」の変数に、作ったミドルウェアを登録する一行を追加してミドルウェアを登録する。

laravelでミドルウェアをkerenel.phpに登録する画像

 

ミドルウェア追記の書式は下記。

#ミドルウェア追記の書式

'hello' => \App\Http\Middleware\HelloMiddleware::class,

 

◯◯MiddleWareとして作成した〇〇の部分をキーにして、ミドルウェアのクラスを指定する

 

以上で作成したミドルウェアがlaravelに登録され、利用可能になる。

 

ミドルウェアの実行

次に、
登録したミドルウェアを実行するための手順を紹介していく。

最初にポイントを言ってしまうと、
ミドルウェアは、ルーティングの際に実行するのが一般的だ。

すなわち編集ファイルは「web.php」となる。

 

下記は「helloMiddleware」を呼び出す例

Route::get('hello', 'HelloController@index')
    ->middleware(helloMiddleware::class);      #ミドルウェアの呼び出し

 

ルーティング処理の記述の後に、メソッドチェーン(->)で、middlewareメソッドを書く。
引数は利用するミドルウェアのクラス。
これで/helloでミドルウェアが動くようになる。

ちなみにこのメソッドチェーンは連続して書くことができる。

 

コントローラの前後に処理をする【リクエストとレスポンスから理解する】

ミドルウェアはコントローラ処理の前後に割り込むと言った。
この前後とは何だろう。

これを理解するには、
ミドルウェアのhandleメソッド記述内、$next()メソッドの呼び出し位置が鍵となる。

public function handle($request, Closure $next){
     return $next($request); //このメソッド
}

 

$next()メソッドとは、
web.phpで記述した、コントローラのアクションメソッドを呼びだすメソッドだ。

Route::get('hello', 'HelloController@index')  //$nextによって、このindexが呼ばれる
     ->middleware(helloMiddleware::class);

 

この$nextでリクエストを送る前なのか、後なのかで、前処理か、後処理か、という使い分けをしている。

 

$nextを実行するの前になんらかの処理を記述するのが、前処理

public function handle($request, Closure $next)
{

    //&nextより前に処理を記述(前処理)

    return $next($request);
}

 

まず$nextを実行しレスポンスを保持しておいて、その後になんらかの処理を記述するのが後処理

public function handle($request, Closure $next)
{   

    //まずnextを実行、結果を保持
    $request = $next($request)

    //後処理

    return $request;
}

 

 

②グローバルミドルウェア

laravelのミドルウェア2つめはグローバルミドルウェアだ。

グローバルミドルウェアは登録しておくと、
すべてのリクエストに対して自動的に呼び出されるミドルウェアだ。

なので、共通で実行したい処理を設定するなどの用途に適しているだろう。

 

グローバルミドルウェアの登録

グローバルミドルウェアの登録先は単体のミドルウェアと同様に「Kernel.php」

app→Http→Kernel.php

 

「$middleware」の変数に、作ったミドルウェアを登録する一行を追加する。
単体のミドルウェアの登録時と同じく、一行追加して登録する。

 

通常、ミドルウェアはルーティングファイルにある、個々のルーティングに、メソッドチェーンを書いて呼び出していた。

Route::get('hello', 'HelloController@index')
     ->middleware(helloMiddleware::class);  //単体のミドルウェアは、メソッドチェーンで呼び出す

 

しかし、グローバルミドルウェアに登録されているミドルウェアは、
明示的に呼び出す記述がなくても、すべてのリクエストに対して呼び出される。

つまり、共通のミドルウェアならグローバルにしといた方が楽だし、実行の漏れもなくなるというメリットがある。

 

③ミドルウェアグループ

3つ目は、ミドルウェアグループ
ミドルウェアグループは、複数のミドルウェアをまとめたグループのこと

ミドルウェアグループを呼び出すようにしておくと、アクセスがあった場合、
グループに登録してあるミドルウェアがすべて呼び出される。

 

ミドルウェアグループの登録

ミドルウェアグループの登録先も、「Kernel.php」

app→Http→Kernel.php

 

「$middlewareGroups」の変数に、
キーがグループ名、値に個々のミドルウェアクラスを指定して登録する。

group-middleware

 

ミドルウェアグループの呼び出し方

単体のミドルウェアを呼び出す時と同様、web.phpから、メソッドチェーンでmiddlewareメソッドを実行し、呼び出す。

Route::get('hello', 'HelloController@index')
     ->middleware(‘グループ名’);

 

個々のミドルウェアのときはクラス名で指定していたのに対し、
グループミドルウェアの場合、「グループ名」を指定する

 

関連記事

(Laravel) ビューコンポーザの使い方
(Laravel) コンポーネントとサブビューの違い

http://laravel.jp/

https://readouble.com/laravel/7.x/ja/middleware.html

https://qiita.com/shizen-shin/items/5e050bf07b2257a6a1d7

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。