PHP フレームワーク Laravel 8: ミドルウェア

 ミドルウェアはメソッド Route::get(もしくは Route::post)の第 2 引数に渡す関数の呼び出しの前/後(リクエスト/レスポンス)に処理を加える機能です。
※ 以下のフォルダに Laravel をインストールしたこととする。
C:\Site01
※ 以下のコマンドを実行し HTTP サーバを起動したこととする。
(ブラウザで「http://127.0.0.1/」へアクセスしたら表示される)
C:\Site01> php artisan serve
1.  ミドルウェアを作成。以下のコマンドを実行する。
C:\Site01> php artisan make:middleware MyMiddleware
  • .\app\Http\Middleware\MyMiddleware.php が作成される。
  • MyMiddleware.php には MyMiddleware クラスが定義される(ネームスペース App\Http\Middleware)。
  • ミドルウェア(MyMiddleware クラス)は派生クラスではない。
  • ミドルウェア(MyMiddleware クラス)は handle メソッドのみが定義される。
2.  ミドルウェアの処理は以下のように追加する。
(MyMiddleware クラスの handle メソッドの内容)
public function handle( Request $request, Closure $next )
{
    // ここに処理を追加すれば Route::get 関数の第 2 引数へ渡した関数を
    // 呼び出す前に処理される。(リクエストを変更する)
    error_log( 'MyMiddleware: リクエストを変更' );

    // リスエストを変更する場合は margin メソッドを呼び出す
    $request->margin(
    [
        'pageTitle' => '○○○○',
    ] );

    $response = $next( $request );

    // ここに処理を追加すれば Route::get 関数の第 2 引数へ渡した関数を
    // 呼び出した後に処理される。(レスポンスを変更する)
    error_log( 'MyMiddleware: レスポンス変更' );

    return $response;
} );
3.  ミドルウェアの使用(その1)。
 1つのルートに1つのミドルウェアを適用する。
3-1.  C:\Site01\routes\web.php の先頭に追加する。
use App\Http\Middleware\MyMiddleware
3-2.  C:\Site01\routes\web.php のルート設定に続けて middleware メソッドを呼び出す。
Route::get( '/', function()
{
    return 'Hello world';
} )->middleware( MyMiddleware::class );
4.  ミドルウェアの使用(その2:グループ)。
 複数のルートにまとめてミドルウェアを適用する。
4-1.  .\app\Http\Kernel.php で定義している $middlewareGroups(Kernel クラスのプロパティ)にミドルウェアを追加する。
protected $middlewareGroups = [
    // 省略

    'My' => [
        App\Http\Middleware\MyMiddleware::class,
    ],
];
4-2.  C:\Site01\routes\web.php にルート設定を以下のように追加する。
Route::group( ['middleware' => ['My']], function ()
{
    Route::get( '/01', function()
    {
        return '01: Hello world';
    } );

    Route::get( '/02', function()
    {
        return '02: Hello world';
    } );
} );
4-3.  別の設定方法。(4-2 と同じ意味)
Route::middleware( ['My'] )->group( function ()
{
    Route::get( '/01', function()
    {
        return '01: Hello world';
    } );

    Route::get( '/02', function()
    {
        return '02: Hello world';
    } );
} );
5.  ミドルウェアの使用(その3:グローバル)。
 全てのルートにミドルウェアを適用する。
 C:\Site01\Http\Kernel.php で定義している $middleware(Kernel クラスのプロパティ)にミドルウェアを追加する。
protected $middleware = [
    // 省略

    App\Http\Middleware\MyMiddleware::class,
];
6.  ミドルウェアの使用(その4:コントローラ)。
 特定のコントローラにミドルウェアを適用する。
6-1.  コントローラの全アクション・メソッドにミドルウェアを適用する。
class MyController extends Controller
{
    public function __construct()
    {
        $this->middleware( function( $request, $next )
        {
            $response = $next( $request );
            return $response;
        } );
    }

    public function index()
    {
        // 内容は省略
    }

    public function user()
    {
        // 内容は省略
    }

    public function show()
    {
        // 内容は省略
    }
}
6-2.  コントローラの特定アクション・メソッドにミドルウェアを適用する。
class MyController extends Controller
{
    public function __construct()
    {
        $this->middleware( function( $request, $next )
        {
            $response = $next( $request );
            return $response;
        } )->only( ['index', 'user'] );
    }

    public function index()
    {
        // 内容は省略
    }

    public function user()
    {
        // 内容は省略
    }

    public function show()
    {
        // 内容は省略
    }
}
6-3.  コントローラの特定アクション・メソッドを除いてミドルウェアを適用する。
class MyController extends Controller
{
    public function __construct()
    {
        $this->middleware( function( $request, $next )
        {
            $response = $next( $request );
            return $response;
        } )->except( ['index', 'user'] );
    }

    public function index()
    {
        // 内容は省略
    }

    public function user()
    {
        // 内容は省略
    }

    public function show()
    {
        // 内容は省略
    }
}

 以上です。