Laravel ミドルウェアの設定について

# 内容
- Laravelでのミドルウェア設定方法についての簡単なまとめ
- 具体的なミドルウェアの処理の実装に関しては記載しておりません。

# 環境
- macOS Mojave 10.14.6
- Laravel Framework 5.8.33

# Middlewareとは
![](https://i.imgur.com/LHdx8Rf.png)


- ミドルウェアではユーザーからのHTTPリクエストに対して処理の前後に加えたい処理を挿入することができる。
- その前後の処理をそれぞれ**Before Middleware**と**After Middleware**といい、レンダリングされるまでの入口と出口でミドルウェアを通ることになる。そのBeforeとAfterの書き分けはMiddlewareクラス内で行う。

# Middlewareクラスの生成

Middlewareクラスの生成はLaravelのプロジェクトのディレクトリまで移動し次のコマンドを実行する
今回はSampleというクラス名のMiddlewareを生成することにする

```sh
$ php artisan make:middleware {クラス名}

// Sampleというクラス名の場合
$ php artisan make:middleware Sample
```

- `app/Http/Middleware/`下にSmaple.phpが生成される
- 生成されたMiddlewareクラス内にある`handle()`に実装内容を追記していく
    - `$response = $next($request);`の前に実装内容を記載するか、後に記載するかで**Before Middleware**か**after Middleware**かを書き分ける事ができる

![](https://i.imgur.com/6eGa63H.png)



# ミドルウェアの登録
**Before Middleware**もしくは**After Middleware**の実装が完了したミドルウェアを実際に通すようにするには**Karnel.php**へ追記する

```php:app/Http/Kernel.php
<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        ...
    ];
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            ...
        ],

        'api' => [
            'throttle:60,1',
            'auth:api',
            ...
        ],
    ];
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        ...
    ];
    protected $middlewarePriority = [
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\Authenticate::class,
        ...
    ];
}

```

## $middleware(グローバルミドルウェア)
- アプリケーションの全HTTPリクエストで実行したいミドルウェアを書く

## $middlewareGroups(ミドルウェアグループ)
- 複数のミドルウェアをまとめて登録
- 短縮キーを指定して、より多くのミドルウェアをグループとして登録する

## $routeMiddleware(ルートミドルウェア)
- ミドルウェアを個々に登録
- 短縮キーを指定して通したいミドルウェアを書く

## $middlewarePriority
- 特定の順番でミドルウェアの実行をする必要がある場合に、記載順でミドルウェアが優先して実行される
- グローバルミドルウェアではないものを記載する。
- `$middlewareGroups`や`$routeMiddleware`に登録したもので最優先にしたいものをこちらにも書いておく



# routeに対してミドルウェアを割り当てる
## $middlewareGroupsを割り当てる
`$middlewareGroups`で**web**を**key**として登録し、それを割り当てる場合

```php:/route/web.php
// 1つのルートに対してミドルウェアを指定する場合
Route::get('/', function () {
    //
})->middleware('web');

// 複数のルートに対してミドルウェアを指定する場合
Route::group(['middleware' => ['web']], function () {
    //
});
```

## $routeMiddlewareを割り当てる
`$routeMiddleware`に**auth**というミドルウェアを登録し、それを割り当てる場合

```php:/route/web.php
// 一つのルートに対してミドルウェアを指定する場合
Route::get('/', function () {
    //
})->middleware('auth');

// １つのルートに対して複数のミドルウェアを指定する場合
Route::get('/', function () {
    //
})->middleware('auth', 'auth2');

// 複数のルートに対して１つのミドルウェアを指定する場合
Route::group(['middleware' => 'auth'], function () {
    //
});

// 複数のルートに対して複数のミドルウェアを指定する場合
Route::group(['middleware' => ['auth', 'auth2'], function () {
    //
});
```

# 参考
https://readouble.com/laravel/5.8/ja/middleware.html
https://www.ritolab.com/entry/69