【PHP/Laravel】middleware(ミドルウェア)。タスクの前後に処理を挟む。
middlewareの概要と作成
- タスクの前後でリクエストを検査し、条件外のものは除外するなどの制御(認証の確認、リダイレクト)を加える。条件に合致するならば、リクエストを許可する。
- ディレクトリは、app/Http/Middleware。
- ミドルウェアの作成。命名規則はアッパーキャメルケース(パスカルケース)。デフォルトは以下の通りで、条件を通過すれば、return $next($request);でリクエストを通す(あるいは、リクエストが処理された後でタスクを実行するように書くことも出来る)。
php artisan make:middleware TestNameExample
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class TestNameExample
{
/**
* Handle an incoming request
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
return $next($request);
}
}
登録と設定
- ミドルウェアは、app/Http/Kernel.phpクラスに設定する。
- すべてのリクエストに対しミドルウェアを実行するには、$middlewareプロパティに追加する。
/*すべてのリクエスト The application's global HTTP middleware stack.
These middleware are run during every request to your applicaton.*/
protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
\Illuminate\Http\Middleware\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
// etc
//追加
\App\Http\Middleware\TestNameExample::class,
];
- 特定のルートに対しミドルウェアを指定したい場合には、$routeMiddlewareプロパティに追加する。
追加後は、ルートに割り当てることが出来る。配列を割り当てることで、複数のミドルウェアを指定可能となっている。
/*ルート The application's route middleware.
These middleware may be assigned to groups or used individually.*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
//追加
'test.auth' => \App\Http\Middleware\TestNameExample::class,
];
Route::get('/login',[LoginController::class, 'index'])->middleware('test.auth')->name('login');
Route::get('/login',[LoginController::class, 'index'])->middleware(['auth', 'test.auth'])->name('login');
middleware、guard、gate、policy
- gateやpolicyは認可で、そもそもの入口部分の権限があるか否かを設定する。policyで特定のモデルなどより詳細に設定する。
- middlewareとguardは認証に関係する部分で、guardの指定によりルートに対して個別の認証を設定することができる。
//guardの指定
Route::get('/login',[LoginController::class, 'index'])->middleware('test.auth:admin')->name('login');
参照
・Laravel 9.x ミドルウェア
・Laravel 9.x 認証
・Laravel 9.x 認可
・【Laravel】 認証や認可に関する補足資料