ミドルウェア
##ミドルウェア グループ
- ##ミドルウェアの種類
- #ミドルウェア パラメータ #終了可能なミドルウェア
はじめに
ミドルウェアは、アプリケーションに入る HTTP リクエストをフィルタリングする便利なメカニズムを提供します。たとえば、Laravel には、アプリケーションのユーザー認証を検証するミドルウェアが含まれています。ユーザーが認証されていない場合、ミドルウェアはユーザーをログイン インターフェイスにリダイレクトします。ただし、ユーザーが認証されると、ミドルウェアはアプリケーションへのリクエストをさらに許可します。
もちろん、ID 認証に加えて、さまざまなタスクを実行する追加のミドルウェアを作成することもできます。たとえば、CORS ミドルウェアは、アプリケーションから送信されるすべての応答に適切なヘッダー情報を追加する役割を担うことができ、ロギング ミドルウェアは、アプリケーションに受信されるすべてのリクエストを記録できます。
Laravel には、認証、CSRF 保護などのいくつかのミドルウェアが付属しています。これらのミドルウェアはすべて、
app/Http/Middleware
ディレクトリにあります。ミドルウェアを定義する
make:middleware
アーティザン コマンドを実行して新しいミドルウェアを作成する:php artisan make:middleware CheckAge
このコマンドは、
app/Http/Middleware
ディレクトリに新しいCheckAge
クラスを作成します。このミドルウェアでは、age## のみを許可します
#200より大きいパラメータを持つリクエストはこのルートにアクセスします。それ以外の場合は、
home<?php namespace App\Http\Middleware; use Closure;class CheckAge{ /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if ($request->age <= 200) { return redirect('home'); } return $next($request); } }
にリダイレクトされます。 ご覧のとおり、指定された ## の場合#ageパラメータが
HTTP200
以下の場合、このミドルウェアは HTTP リダイレクトをクライアントに返します。それ以外の場合、リクエストはさらにアプリケーションに渡されます。リクエストを引き続きアプリケーションに渡すには (つまり、ミドルウェアが検証に「合格」できるようにする)、パラメータとして$request
を指定してコールバック関数$next
を呼び出すだけです。ミドルウェアは、アプリケーションの「層」に到達するために通過する必要がある一連の
リクエストとして考えるのが最善です。各レイヤーはリクエストをチェックして特定の基準を満たしているかどうかを確認し、満たさない場合は (アプリケーションへのアクセスをリクエストする前に) リクエストを完全に拒否することもできます。
{ヒント} すべてのミドルウェアはサービス コンテナを介して渡されるため、必要な依存関係をミドルウェアのコンストラクターに入力できます。プレ&ポストミドルウェアミドルウェアは、ミドルウェア自体に応じて、リクエストの前または後に実行されます。たとえば、次のミドルウェアは、アプリケーションがリクエストを処理する前に
何らかのタスクを実行します:
は、アプリケーションがリクエストを処理した後で<?php namespace App\Http\Middleware; use Closure;class BeforeMiddleware{ public function handle($request, Closure $next) { // Perform action return $next($request); } }
ただし、このミドルウェア何らかのタスク を実行します。 :
<?php namespace App\Http\Middleware; use Closure; class AfterMiddleware{ public function handle($request, Closure $next) { $response = $next($request); // Perform action return $response; } }
登録ミドルウェアapp/Http/Kernel.php
$middleware属性にリストするだけです。ルーティング用のミドルウェアの配布
指定したルートのミドルウェアを配布すると仮定すると、最初に
app/Http/Kernel.php
ファイル内のミドルウェアにミドルウェアを割り当てる必要があります。 。 鍵。デフォルトでは、Laravel の組み込みミドルウェアは、このクラスの$routeMiddleware
属性に含まれています。カスタム ミドルウェアを追加するには、リストに追加してカスタム キーを割り当てるだけです。例:// 在 App\Http\Kernel 类中... 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, ];
HTTP カーネルでミドルウェアが定義されたら、
middleware
メソッドを使用してルートにミドルウェアを割り当てることができます。Route::get('admin/profile', function () { // })->middleware('auth');
ミドルウェアを割り当てることもできます。複数のミドルウェアの配布:
Route::get('/', function () { // })->middleware('first', 'second');
ミドルウェアを割り当てるときに、完全なクラス名を渡すこともできます:
use App\Http\Middleware\CheckAge; Route::get('admin/profile', function () { // })->middleware(CheckAge::class);
# #Middle Componentキーを使用して複数のミドルウェアを 1 つのグループにパッケージ化し、ルートに簡単に適用できるようにしたい場合があります。 Http Core の$middlewareGroups
Laravel には、すぐに使える組み込みの属性を使用できます。
web
および
apiミドルウェア グループがあり、Web UI および API ルーティングに適用できる一般的なミドルウェアが含まれています。 ##
ミドルウェア グループは、個々のミドルウェアと同じ構文を使用して、ルートおよびコントローラーのアクションに割り当てることができます。同様に、ミドルウェアを使用すると、複数のミドルウェアを一度にルートに簡単に割り当てることができます。/** * 应用程序的路由中间件组 * * @var array */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ ' throttle:60,1', 'auth:api',], ];
Route::get('/', function () { // })->middleware('web'); Route::group(['middleware' => ['web']], function () { // });
{ヒント}RouteServiceProvider
のデフォルトは
web
ミドルウェア グループです 自動的に適用されますroutes/web.php
に。ミドルウェアの並べ替えまれに、特定の順序で実行されるミドルウェアが必要になる場合があります。ただし、ルートに割り当てられるときの順序を制御することはできません。この場合、ミドルウェアの優先順位は、
app/Http/Kernel.phpファイルの
##ミドルウェアのパラメーターミドルウェアは他のパラメーターも受け取ることができます。たとえば、特定のアクションを実行する前に、アプリケーションがユーザーが特定の「ロール」であることを確認する必要がある場合、「ロール」名を追加パラメータとして受け取る$middlewarePriority
属性を使用して指定できます:/** * 中间件的优先级排序列表 * * 将会强制非全局中间件始终保持给定的顺序。 * * @var array */ protected $middlewarePriority = [ \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\Authenticate::class, \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \Illuminate\Auth\Middleware\Authorize::class,];
CheckRole
ミドルウェアを作成できます。
パラメータの後にミドルウェアに渡す必要があります:追加の中間パラメータは、
$next<?php namespace App\Http\Middleware; use Closure;class CheckRole{ /** * 处理传入的参数 * * @param \Illuminate\Http\Request $request * @param \Closure $next * @param string $role * @return mixed */ public function handle($request, Closure $next, $role) { if (! $request->user()->hasRole($role)) { // Redirect... } return $next($request); } }
ルートを定義するときに中間を
: で区切ります。ファイル名とパラメータを使用してミドルウェアパラメータを指定します。複数のパラメータを区切るにはカンマを使用します:Route::put('post/{id}', function ($id) { // })->middleware('role:editor');
終了可能なミドルウェア
ミドルウェアは、HTTP 応答を準備した後に何らかの作業を行う必要がある場合があります。たとえば、Laravel の組み込み「セッション」ミドルウェアは、応答の準備が完全に完了すると、セッション データをストレージに書き込みます。ミドルウェアで
terminate
メソッドを定義すると、応答をブラウザに送信する準備ができた後に、このメソッドが自動的に呼び出されます。<?php namespace Illuminate\Session\Middleware; use Closure; class StartSession{ public function handle($request, Closure $next) { return $next($request); } public function terminate($request, $response) { // Store the session data... } }
terminate
メソッドはリクエストとレスポンスの両方を受信する必要があります。このミドルウェアを定義したら、app/Http/Kernel.php
ファイルのルート リストまたはグローバル ミドルウェアに忘れずに追加してください。ミドルウェアで
terminate
メソッドを呼び出すと、Laravel はサービス コンテナから新しいミドルウェア インスタンスを解決します。handle
メソッドとterminate
メソッドを呼び出すときに同じミドルウェア インスタンスを使用している場合は、コンテナーのsingleton
メソッドを使用してミドルウェアをコンテナーに登録します。