新潟県最大級のポータイルサイトを情報技術を駆使して盛り上げたい方を募集しています。

LaravelでMiddlewareを使う

Laravel2

以前の記事では共通関数の呼び出しについて解説しました。
今回は呼び出さない共通処理、Middlewareについて解説していきます。
会員機能を作るときに必ずつきまとう認証処理、都度書くの面倒ですよね?
認証は通っているか、有効期限はOKか、NGだった場合はどうするかなど、いい感じに自動処理してくれたら最高ですよね?
そんなときはMiddlewareの出番です。
せっかくフレームワークを使うのですから、便利機能で開発効率を上げていきましょう。
※認証処理は一例で、Middlewareは共通的な事前・事後処理が必要な場合に活用できる機能です

当記事の読者は以下のような方を対象としています。
がっつり極めたい方には物足りない内容ですのでご了承ください。

  • Laravelを使いこなしたい
  • Middlewareが気になる
  • 共通処理を簡単に実装したい
  • PHPエンジニアとしてステップアップしたい

Middlewareとは?

LaravelはHTTPリクエストを処理する際、Route定義に沿って動きます。
Request⇒Application⇒Response
Middlewareを実装した場合はApplicationの前処理としてMiddlewareが実行されます。
Request⇒Middleware⇒Application⇒Response

つまり認証制御を実装したければ
Request⇒Application(認証制御+ビジネスロジック)⇒Response
ではなくて
Request⇒Middleware(認証制御)⇒Application(ビジネスロジック)⇒Response
と実装すればよいわけです。
こうすればApplicationはMiddlewareによって認証制御されたリクエストしか受け取らないため、認証制御を意識しなくてもよくなります。

実装例

まずはMiddlewareのひな形を生成します。

laradock@9ec5c1833251:/var/www/ietsuku$ php artisan make:middleware Sample
Middleware created successfully.
laradock@9ec5c1833251:/var/www/ietsuku$

app\Http\Middleware配下に指定した名前でひな形ファイルが生成されます。

laradock@9ec5c1833251:/var/www/ietsuku/app/Http/Middleware$ ls
Authenticate.php             EncryptCookies.php  RedirectIfAuthenticated.php  TrimStrings.php   VerifyCsrfToken.php
CheckForMaintenanceMode.php  FireBaseAuth.php    Sample.php                   TrustProxies.php

handleに必要な処理を記述します(今回は具体的な処理は割愛、次回以降実処理を説明するかもです)。

<?php

namespace App\Http\Middleware;

use Closure;

class Sample
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        // ここに処理を書く
        return $next($request);
    }
}

次にMiddlewareをLaravelに登録します。
いくつかの登録方法がありますが、今回は一番使うであろうルート登録による方法を説明します。
とはいえ、app\Http\Kernel.phpに作ったMiddlewareを記述するだけです。

    protected $routeMiddleware = [



        'sample' => \App\Http\Middleware\Sample::class,
    ];

最後にMiddlewareの呼び出しを記述します。
routes\web.phpを開いてMiddlewareを適用したいRoute定義を囲むだけです。
この記述によって/password、/confirmleaveへHTTPリクエストが渡る前にMiddlewareが実行されます。

        Route::group(['middleware' => 'sample'], function() {
            Route::get('/password', 'AccountController@password')->name('password');
            Route::get('/confirmleave', 'AccountController@confirmLeave')->name('confirmleave');
        });

例えば勘定系のシステムなどは証跡記録が必須ですよね。
Middlewareは前処理・後処理どちらにも指定できるので、証跡記録処理を書いたMiddlewareを全体の前後処理に適用すれば・・・?

どうですか?Middlewareもっと覚えたくなってきましたよね?
興味を持つことこそスキルアップの第一歩です。