Laravel-middleware

提供:Dev Guides
移動先:案内検索

Laravel-ミドルウェア

ミドルウェアは、リクエストとレスポンスの間のブリッジとして機能します。 これは、フィルタリングメカニズムの一種です。 この章では、Laravelのミドルウェアメカニズムについて説明します。

Laravelには、アプリケーションのユーザーが認証されているかどうかを検証するミドルウェアが含まれています。 ユーザーが認証されると、ホームページにリダイレクトされます。認証されない場合は、ログインページにリダイレクトされます。

ミドルウェアは、次のコマンドを実行して作成できます-

php artisan make:middleware <middleware-name>
*<middleware-name>* をミドルウェアの名前に置き換えます。 作成するミドルウェアは、 *app/Http/Middleware* ディレクトリにあります。

ミドルウェアのメカニズムを理解するには、次の例を観察してください-

  • ステップ1 *-AgeMiddlewareを作成しましょう。 それを作成するには、次のコマンドを実行する必要があります-
php artisan make:middleware AgeMiddleware
  • ステップ2 *-コマンドが正常に実行されると、次の出力が表示されます-

AgeMiddleware

ステップ3 *- *AgeMiddlewareapp/Http/Middleware に作成されます。 新しく作成されたファイルには、次のコードが既に作成されています。

<?php

namespace App\Http\Middleware;
use Closure;

class AgeMiddleware {
   public function handle($request, Closure $next) {
      return $next($request);
   }
}

ミドルウェアの登録

使用する前に、すべてのミドルウェアを登録する必要があります。 Laravelには2種類のミドルウェアがあります。

  • グローバルミドルウェア
  • ルートミドルウェア

グローバルミドルウェア*はアプリケーションのすべてのHTTPリクエストで実行されますが、*ルートミドルウェア*は特定のルートに割り当てられます。 ミドルウェアは、 app/Http/Kernel.php。に登録できます。このファイルには、2つのプロパティ *$ middleware および $ routeMiddleware が含まれています。 $ middleware プロパティはグローバルミドルウェアの登録に使用され、 $ routeMiddleware プロパティはルート固有のミドルウェアの登録に使用されます。

グローバルミドルウェアを登録するには、$ middlewareプロパティの最後にクラスをリストします。

protected $middleware = [
   \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
   \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,
];

ルート固有のミドルウェアを登録するには、キーと値を$ routeMiddlewareプロパティに追加します。

protected $routeMiddleware = [
   'auth' => \App\Http\Middleware\Authenticate::class,
   'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
   'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];

前の例で AgeMiddleware を作成しました。 ルート固有のミドルウェアプロパティに登録できるようになりました。 その登録のコードを以下に示します。

以下は app/Http/Kernel.php のコードです-

<?php

namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel {
   protected $middleware = [
      \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
      \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,
   ];

   protected $routeMiddleware = [
      'auth' => \App\Http\Middleware\Authenticate::class,
      'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
      'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
      'Age' => \App\Http\Middleware\AgeMiddleware::class,
   ];
}

ミドルウェアのパラメーター

ミドルウェアでパラメーターを渡すこともできます。 たとえば、アプリケーションにユーザー、管理者、スーパー管理者などのさまざまなロールがある場合 ロールに基づいてアクションを認証する場合、これはミドルウェアでパラメーターを渡すことで実現できます。 作成するミドルウェアには次の関数が含まれており、 $ next 引数の後にカスタム引数を渡すことができます。

public function handle($request, Closure $next) {
   return $next($request);
}

  • ステップ1 *-次のコマンドを実行してRoleMiddlewareを作成します-
php artisan make:middleware RoleMiddleware
  • ステップ2 *-実行が成功すると、次の出力が表示されます-

ミドルウェアのパラメーター

ステップ3 *-新しく作成されたRoleMiddlewareatのhandleメソッドに次のコードを追加します app/Http/Middleware/RoleMiddleware.php。*

<?php

namespace App\Http\Middleware;
use Closure;

class RoleMiddleware {
   public function handle($request, Closure $next, $role) {
      echo "Role: ".$role;
      return $next($request);
   }
}

ステップ4 *-RoleMiddlewareを *app \ Http \ Kernel.php ファイルに登録します。 そのファイルに灰色で強調表示された行を追加して、RoleMiddlewareを登録します。

RoleMiddleware

ステップ5 *-次のコマンドを実行して *TestController を作成します-

php artisan make:controller TestController --plain
  • ステップ6 *-上記のステップが正常に実行されると、次の出力が表示されます-

TestController

ステップ7 *-次のコード行を *app/Http/TestController.php ファイルにコピーします。

*app/Http/TestController.php*
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class TestController extends Controller {
   public function index() {
      echo "<br>Test Controller.";
   }
}

ステップ8 *- *app/Http/routes.php ファイルに次のコード行を追加します。

*app/Http/routes.php*
Route::get('role',[
   'middleware' => 'Role:editor',
   'uses' => 'TestController@index',
]);
  • ステップ9 *-次のURLにアクセスして、パラメーターを使用してミドルウェアをテストします。
http://localhost:8000/role
  • ステップ10 *-出力は次の画像のように表示されます。

ロールエディター

終了可能なミドルウェア

終了可能なミドルウェアは、応答がブラウザーに送信された後に何らかのタスクを実行します。 これは、ミドルウェアで terminate メソッドを使用してミドルウェアを作成することで実現できます。 終了可能なミドルウェアは、グローバルミドルウェアに登録する必要があります。 terminateメソッドは、2つの引数 $ request および* $ response。*を受け取ります。Terminateメソッドは、次のコードに示すように作成できます。

ステップ1 *-以下のコマンドを実行して *TerminateMiddleware を作成します。

php artisan make:middleware TerminateMiddleware
  • ステップ2 *-上記のステップにより、次の出力が生成されます-

終了可能なミドルウェア

ステップ3 *- app/Http/Middleware/TerminateMiddleware.php。で新しく作成された *TerminateMiddleware に次のコードをコピーします。

<?php

namespace App\Http\Middleware;
use Closure;

class TerminateMiddleware {
   public function handle($request, Closure $next) {
      echo "Executing statements of handle method of TerminateMiddleware.";
      return $next($request);
   }

   public function terminate($request, $response) {
      echo "<br>Executing statements of terminate method of TerminateMiddleware.";
   }
}

ステップ4 *- *Term \ Middlewareapp \ Http \ Kernel.php ファイルに登録します。 そのファイルに灰色で強調表示された行を追加して、TerminateMiddlewareを登録します。

TerminateMiddleware

ステップ5 *-次のコマンドを実行して *ABCController を作成します。

php artisan make:controller ABCController --plain
  • ステップ6 *-URLが正常に実行されると、次の出力が表示されます-

ABCController

ステップ7 *-次のコードを *app/Http/ABCController.php ファイルにコピーします。

*app/Http/ABCController.php*
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ABCController extends Controller {
   public function index() {
      echo "<br>ABC Controller.";
   }
}

ステップ8 *- *app/Http/routes.php ファイルに次のコード行を追加します。

*app/Http/routes.php*
Route::get('terminate',[
   'middleware' => 'terminate',
   'uses' => 'ABCController@index',
]);
  • ステップ9 *-次のURLにアクセスして、Terminableミドルウェアをテストします。
http://localhost:8000/terminate
  • ステップ10 *-出力は次の画像のように表示されます。

ABC Controller