Laravelで前処理、後処理を実装する

# 目次
Laravelの記事一覧は下記
[PHPフレームワークLaravelの使い方](https://qiita.com/toontoon/items/c4d0371e504c37f6576e)

# Laravelバージョン
動作確認はLaravel Framework 7.19.1で行っています

# 前提条件
[eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)](https://qiita.com/toontoon/items/76fa7f8845b20776077c)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています

# 前処理、後処理をつくる
Laravelで前処理、後処理を行うにはMiddlewareを作成します

$nextの前に書く処理が前処理となります

$nextの後に書く処理が後処理となります

(1) /sample/app/Http/Middleware/GlobalSample.php作成

```GlobalSample.php
<?php

namespace App\Http\Middleware;

use Closure;

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

        error_log("before GlobalSample\n", 3, __DIR__ . DIRECTORY_SEPARATOR  . "sample.log");

        $response = $next($request);

        error_log("after GlobalSample\n", 3, __DIR__ . DIRECTORY_SEPARATOR  . "sample.log");

        return $response;

    }
}

```

(2) /sample/app/Http/Middleware/GroupSample1.php作成

```GroupSample1.php
<?php

namespace App\Http\Middleware;

use Closure;

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

        error_log("before GroupSample1\n", 3, __DIR__ . DIRECTORY_SEPARATOR  . "sample.log");

        $response = $next($request);

        error_log("after GroupSample1\n", 3, __DIR__ . DIRECTORY_SEPARATOR  . "sample.log");

        return $response;

    }
}

```

(3) /sample/app/Http/Middleware/GroupSample2.php作成

```GroupSample2.php
<?php

namespace App\Http\Middleware;

use Closure;

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

        error_log("before GroupSample2\n", 3, __DIR__ . DIRECTORY_SEPARATOR  . "sample.log");

        $response = $next($request);

        error_log("after GroupSample2\n", 3, __DIR__ . DIRECTORY_SEPARATOR  . "sample.log");

        return $response;

    }
}

```


(4) /sample/app/Http/Middleware/RouteSample.php作成

```RouteSample.php
<?php

namespace App\Http\Middleware;

use Closure;

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

        error_log("before RouteSample\n", 3, __DIR__ . DIRECTORY_SEPARATOR  . "sample.log");

        $response = $next($request);

        error_log("after RouteSample\n", 3, __DIR__ . DIRECTORY_SEPARATOR  . "sample.log");

        return $response;

    }
}

```

(5) (1)～(4)で作成したMiddlewareを登録します
/sample/app/Http/Kernel.phpを編集して登録します

Kernel.phpに定義されている$middleware配列に
\App\Http\Middleware\GlobalSample::class,
を追加

Kernel.phpに定義されている$middlewareGroups配列に
'groupSample' => [
            \App\Http\Middleware\GroupSample1::class,
            \App\Http\Middleware\GroupSample2::class,
        ],
を追加

Kernel.phpに定義されている$routeMiddleware配列に
'routeSample' => \App\Http\Middleware\RouteSample::class,
を追加

```Kernel.php

‥‥

    protected $middleware = [
        ‥‥
        \App\Http\Middleware\GlobalSample::class,
    ];

    protected $middlewareGroups = [
        ‥‥
        'groupSample' => [
            \App\Http\Middleware\GroupSample1::class,
            \App\Http\Middleware\GroupSample2::class,
        ],
    ];

    protected $routeMiddleware = [
        ‥‥
        'routeSample' => \App\Http\Middleware\RouteSample::class,
    ];

‥‥

```

middleware配列は常に適用される前処理、後処理になります
middlewareGroups配列は複数の前処理、後処理を1つの単位として名前付けします
routeMiddleware配列は1つの前処理、後処理に名前付けします


# Controllerにメソッド追加
(1) /sample/app/Http/Controllers/SampleController.phpにbeforeAfterメソッドを追記

```

    public function beforeAfter(Request $request)
    {
        error_log("SampleController\n", 3, dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . "Middleware" . DIRECTORY_SEPARATOR  . "sample.log");

        return view('sample.beforeAfter');
    }

```

(2) /sample/routes/web.phpに下記を追記
`Route::get('sample/before-after', 'SampleController@beforeAfter')->middleware('groupSample')->middleware('routeSample');`

これで先ほど作成したMiddlewareをURLに適用します
'groupSample'、'routeSample'は先ほどKernel.phpで付けた名前です

# viewの作成
/sample/resources/views/sample/beforeAfter.blade.phpファイル作成

```beforeAfter.blade.php
<html>
    <head>
        <title>sample</title>
    </head>
    <body>
        <div>SampleController#beforeAfter</div>
    </body>
</html>

```

# 動作確認
`http://localhost/laravelSample/sample/before-after`

MiddlewareとControllerでerror_log関数を実行しているので
/sample/app/Http/Middleware/sample.log
というファイルができました
sample.logを見ると前処理、後処理が実行されていることが確認できました