以前の記事では共通関数の呼び出しについて解説しました。
今回は呼び出さない共通処理、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もっと覚えたくなってきましたよね?
興味を持つことこそスキルアップの第一歩です。