バージョン 5.1.6 から、ミドルウェア サポートが正式に導入されます。
ミドルウェアは主に、アプリケーションの HTTP リクエストをインターセプトまたはフィルタリングし、必要なビジネス処理を実行するために使用されます。
ミドルウェアの定義
コマンド ライン命令を使用してミドルウェアをすばやく生成できます
php think make:middleware Check
この命令では、application/http/middleware ディレクトリの下にチェックが生成されますミドルウェア。
<?php namespace app\http\middleware; class Check { public function handle($request, \Closure $next) { if ($request->param('name') == 'think') { return redirect('index/think'); } return $next($request); } }
ミドルウェアのエントリ実行メソッドはハンドルメソッドである必要があり、最初のパラメータはRequestオブジェクト、2番目のパラメータはクロージャです。
ミドルウェア ハンドル メソッドの戻り値は、Response オブジェクトである必要があります。
本ミドルウェアでは、現在のリクエストのnameパラメータがthinkと等しいと判断した場合にリダイレクト処理を行います。それ以外の場合、リクエストはさらにアプリケーションに渡されます。引き続きリクエストをアプリケーションに渡すには、$request を引数としてコールバック関数 $next を呼び出すだけです。
特定の要件では、3 番目のパラメーターを使用して追加のパラメーターを渡すことができます。
<?php namespace app\http\middleware; class Check { public function handle($request, \Closure $next, $name) { if ($name == 'think') { return redirect('index/think'); } return $next($request); } }
ミドルウェアの事前/事後
ミドルウェアが特定の操作が要求される前に実行されるか、要求された後に実行されるかは、ミドルウェア自体の定義に完全に依存します。
次はプレビヘイビア用のミドルウェアです
<?php namespace app\http\middleware; class Before { public function handle($request, \Closure $next) { // 添加中间件执行代码 return $next($request); } }
次はポストビヘイビア用のミドルウェアです
<?php namespace app\http\middleware; class After { public function handle($request, \Closure $next) { $response = $next($request); // 添加中间件执行代码 return $response; } }
より実践的な例を見てみましょう。現在の閲覧サーバー環境は WeChat または Alipay
namespace app\http\middleware; /** * 访问环境检查,是否是微信或支付宝等 */ class InAppCheck { public function handle($request, \Closure $next) { if (preg_match('~micromessenger~i', $request->header('user-agent'))) { $request->InApp = 'WeChat'; } else if (preg_match('~alipay~i', $request->header('user-agent'))) { $request->InApp = 'Alipay'; } return $next($request); } }
次に、モバイル版モジュールに middleware.php ファイルを追加します
例: /path/application/mobile/middleware.php
return [ app\http\middleware\InAppCheck::class, ];
その後、コントローラーで $this->request->InApp
ミドルウェアの登録
ルーティング ミドルウェアを通じて関連する値を取得できます。
最も一般的に使用されるミドルウェア登録方法は、ルーティング ミドルウェアを登録することです
Route::rule('hello/:name','hello') ->middleware('Auth');
または完全なミドルウェア クラス名を使用します
Route::rule('hello/:name','hello') ->middleware(app\http\middleware\Auth::class);
複数の登録をサポートしますミドルウェア
Route::rule('hello/:name','hello') ->middleware(['Auth', 'Check']);
V5.1.7 バージョンでは、アプリケーション構成ディレクトリの middleware.php でミドルウェアを直接事前定義できます (実際にはエイリアス識別子を追加します)。例:
return [ 'auth'=>app\http\middleware\Auth::class, 'check'=>app\http\middleware\Check::class ];
次に、ルーティング # でミドルウェア エイリアスを使用して直接登録します。 ##
Route::rule('hello/:name','hello') ->middleware(['auth', 'check']);
return [ 'check'=>[ app\http\middleware\Auth::class, app\http\middleware\Check::class ], ];
Route::rule('hello/:name','hello') ->middleware('check');
Route::group('hello', function(){ Route::rule('hello/:name','hello'); })->middleware('Auth');
V5.1.8 バージョンでは、特定のドメイン名に対するミドルウェアの登録のサポートが開始されました
Route::domain('admin', function(){ // 注册域名下的路由规则 })->middleware('Auth');
追加のパラメーターをミドルウェア ファイルの場合は、
Route::rule('hello/:name','hello') ->middleware('Auth:admin');
を使用できます。定数定義を使用する場合は、2 番目のパラメータでミドルウェア パラメータを渡すことができます。
Route::rule('hello/:name','hello') ->middleware(Auth::class, 'admin');
複数のミドルウェアを定義する必要がある場合は、配列メソッド
Route::rule('hello/:name','hello') ->middleware([Auth::class, 'Check']);
を使用して、同じ追加パラメータ
Route::rule('hello/:name','hello') ->middleware([Auth::class, 'Check'], 'admin');
を渡すことも、ミドルウェア パラメータを個別に指定することもできます。
Route::rule('hello/:name','hello') ->middleware(['Auth:admin', 'Check:editor']);
ミドルウェア クラスを使用する必要はありません。単純な状況では、クロージャを使用してミドルウェアを定義できますが、クロージャは関数は Response オブジェクトのインスタンスを返す必要があります。
Route::group('hello', function(){ Route::rule('hello/:name','hello'); })->middleware(function($request,\Closure $next){ if ($request->param('name') == 'think') { return redirect('index/think'); } return $next($request); });
アプリケーション ディレクトリの下に middleware.php ファイルを定義し、次の方法を使用できます。
<?php return [ \app\http\middleware\Auth::class, 'Check', 'Hello', ];
ミドルウェアの登録完全なクラス名を使用するか、名前空間が指定されていない場合は app\http\middleware を名前空間として使用する必要があります。
グローバルミドルウェアの実行順序は定義順となります。グローバル ミドルウェアを定義するときにミドルウェア パラメーターを渡すことができ、2 つの方法がサポートされています。
<?php return [ [\app\http\middleware\Auth::class, 'admin'], 'Check', 'Hello:thinkphp', ];
上記の定義は、admin パラメーターが Auth ミドルウェアに渡され、thinkphp パラメーターが Hello ミドルウェアに渡されることを意味します。
モジュールミドルウェアバージョン V5.1.8 からモジュールミドルウェアの定義がサポートされ、モジュールディレクトリ直下に middleware.php ファイルを追加し、定義メソッドとミドルウェア定義は同じですが、このモジュールでのみ有効になります。
コントローラ ミドルウェアV5.1.17 以降、コントローラのミドルウェアの定義がサポートされています。まず、コントローラーはシステムの think\Controller クラスを継承し、次にコントローラーでミドルウェア属性を定義する必要があります (例:
<?php namespace app\index\controller; use think\Controller; class Index extends Controller { protected $middleware = ['Auth']; public function index() { return 'index'; } public function hello() { return 'hello'; } }
) インデックス コントローラーが実行されると、Auth ミドルウェアが呼び出されます。完全な名前空間定義の使用をサポートします。
コントローラーの途中で効果的な操作を設定する必要がある場合は、次のように定義できます:
<?php namespace app\index\controller; use think\Controller; class Index extends Controller { protected $middleware = [ 'Auth' => ['except' => ['hello'] ], 'Hello' => ['only' => ['hello'] ], ]; public function index() { return 'index'; } public function hello() { return 'hello'; } }
<?php namespace app\http\middleware; class Hello { public function handle($request, \Closure $next) { $request->hello = 'ThinkPHP'; return $next($request); } }
などのオブジェクト割り当てによって、要求 Pass パラメータをコントローラ (または他の場所) に渡すことができます。渡される変数名は param 変数と競合しないことに注意してください。
そうすれば、コントローラー メソッドで直接使用できます
public function index(Request $request) { return $request->hello; // ThinkPHP }
この記事は、ThinkPHP フレームワークの技術記事コラムからのものです:
http://www.php.cn/phpkj/thinkphp /以上がthinkphp ミドルウェアとはどういう意味ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。