ミドルウェア


#ミドルウェアの割り当てルート

##ミドルウェア グループ

  • ##ミドルウェアの種類
  • #ミドルウェア パラメータ
  • #終了可能なミドルウェア
    • はじめに

      ミドルウェアは、アプリケーションに入る 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

      パラメータが 200 以下の場合、このミドルウェアは HTTP リダイレクトをクライアントに返します。それ以外の場合、リクエストはさらにアプリケーションに渡されます。リクエストを引き続きアプリケーションに渡すには (つまり、ミドルウェアが検証に「合格」できるようにする)、パラメータとして $request を指定してコールバック関数 $next を呼び出すだけです。 ミドルウェアは、アプリケーションの「層」に到達するために通過する必要がある一連の

      HTTP

      リクエストとして考えるのが最善です。各レイヤーはリクエストをチェックして特定の基準を満たしているかどうかを確認し、満たさない場合は (アプリケーションへのアクセスをリクエストする前に) リクエストを完全に拒否することもできます。

      {ヒント} すべてのミドルウェアはサービス コンテナを介して渡されるため、必要な依存関係をミドルウェアのコンストラクターに入力できます。

      プレ&ポストミドルウェア

      ミドルウェアは、ミドルウェア自体に応じて、リクエストの前または後に実行されます。たとえば、次のミドルウェアは、アプリケーションがリクエストを処理する前に

      何らかのタスク

      を実行します:

      <?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;   
                 }
            }

      登録ミドルウェア

      グローバル ミドルウェア

      アプリケーションが処理するすべての HTTP リクエスト中にミドルウェアを実行する場合。このミドルウェアを

      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 メソッドを使用してミドルウェアをコンテナーに登録します。

      この記事は、LearnKu.com Web サイトで初めて公開されました。