ミドルウェア (ミドルウェア)



ミドルウェアをすばやく生成するにはどうすればよいですか?

コマンド ライン経由: app/middleware ディレクトリの下Check ミドルウェアの生成

php think make:middleware Check

ミドルウェア コード:

<?php

namespace app\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\middleware;

class Check
{
    public function handle($request, \Closure $next, $name)
    {
        if ($name == 'think') {
            return redirect('index/think');
        }

        return $next($request);
    }
}

終了スケジュール

ミドルウェアは、リクエストが終了する前のコールバック メカニズムの定義をサポートしています。ミドルウェア クラスに end メソッドを追加するだけで済みます。

    public function end(\think\Response $response)
    {
        // 回调行为
    }

end メソッドでは応答を出力できないことに注意してください。コールバック発行時点でリクエスト・レスポンスの出力が完了しているため。

ミドルウェアの事前/事後

ミドルウェアが特定の操作が要求される前に実行されるか、要求された後に実行されるかは、ミドルウェア自体の定義に完全に依存します。

次はプレビヘイビア用のミドルウェアです

<?php

namespace app\middleware;

class Before
{
    public function handle($request, \Closure $next)
    {
        // 添加中间件执行代码

        return $next($request);
    }
}

次はポストビヘイビア用のミドルウェアです

<?php

namespace app\middleware;

class After
{
    public function handle($request, \Closure $next)
    {
		$response = $next($request);

        // 添加中间件执行代码

        return $response;
    }
}

ミドルウェア メソッドは依存関係の挿入もサポートできます。

より実践的な例を見てみましょう。現在のブラウザ環境が WeChat か Alipay かを判断する必要があります

namespace app\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/app/mobile/middleware.php

return [
    app\middleware\InAppCheck::class,
];

その後、コントローラーで $this->request->InApp

を通じて関連する値を取得できます。ミドルウェアのエイリアスを定義します。

アプリケーション構成ディレクトリの middleware.php でミドルウェアを直接事前定義できます (実際には、エイリアス識別子を追加します)。例:

return [
    'alias' => [
        'auth'  => app\middleware\Auth::class,
        'check' => app\middleware\Check::class,
    ],
];

エイリアスの使用をサポートできます。例:


return [
    'alias' => [
        'check' => [
            app\middleware\Auth::class,
            app\middleware\Check::class,
        ],
    ],
];

登録ミドルウェア

ミドルウェアの新しいバージョンは分割されています。グローバルミドルウェアとアプリケーションミドルウェアに分類 (マルチアプリケーションモードで有効)、ルーティングミドルウェアとコントローラミドルウェアの 4 つのグループがあります。

実行順序は次のとおりです: グローバル徐々に -> アプリケーション ミドルウェア -> ルーティング ミドルウェア -> コントローラー ミドルウェア

グローバル ミドルウェア

グローバル ミドルウェアは、次のメソッドを使用して、app ディレクトリの下の middleware.php ファイルで定義されます:

<?php

return [
	\app\middleware\Auth::class,
    'check',
    'Hello',
];

ミドルウェアのエイリアスが定義されている (またはグループ化されている) 場合は、ミドルウェアの登録には完全なクラス名を使用する必要があります。直接。

グローバルミドルウェアの実行順序は定義順となります。グローバル ミドルウェアを定義するときにミドルウェア パラメーターを渡すことができ、2 つの方法がサポートされています。

<?php

return [
	[\app\http\middleware\Auth::class, 'admin'],
    'Check',
    ['hello','thinkphp'],
];

上記の定義は、admin パラメーターが Auth ミドルウェアに渡され、thinkphp パラメーターが Hello ミドルウェアに渡されることを意味します。

アプリケーションミドルウェア

マルチアプリケーションモードを使用する場合、アプリケーションミドルウェア定義がサポートされます。アプリケーションディレクトリ直下にmiddleware.phpファイルを追加できます。定義方法はグローバルミドルウェア定義と同じですが、以下の環境でのみ有効になります。アプリケーション。

ルーティング ミドルウェア

最も一般的に使用されるミドルウェアの登録方法は、ルーティング ミドルウェアを登録することです

Route::rule('hello/:name','hello')
	->middleware(\app\middleware\Auth::class);

複数のミドルウェアの登録をサポートします

Route::rule('hello/:name','hello')
	->middleware([\app\middleware\Auth::class, \app\middleware\Check::class]);

アプリケーション構成ディレクトリの middleware.php でミドルウェアを直接事前定義できます (実際には、エイリアス識別子を追加します)。次に例を示します。

return [
	'auth'	=>	app\middleware\Auth::class,
    'check'	=>	app\middleware\Check::class
];

次に、ミドルウェアのエイリアスを使用してルーティングに直接登録します。

Route::rule('hello/:name','hello')
	->middleware(['auth', 'check']);

エイリアスの使用によるミドルウェアのグループの定義をサポートできます。例:

return [
	'check'	=>	[
    	app\middleware\Auth::class,
   		app\middleware\Check::class
    ],
];

次に、次のメソッドを直接使用してミドルウェアを登録します。

Route::rule('hello/:name','hello')
	->middleware('check');

ミドルウェアの登録をサポートします。ルーティング グループの場合

Route::group('hello', function(){
	Route::rule('hello/:name','hello');
})->middleware('auth');

特定のドメイン名のミドルウェア登録をサポートします

Route::domain('admin', function(){
	// 注册域名下的路由规则
})->middleware('auth');

追加のパラメーターをミドルウェアに渡す必要がある場合は、それを使用できます

Route::rule('hello/:name','hello')
	->middleware('auth', 'admin');

必要な場合複数のミドルウェアを定義するには、Array メソッドを使用します

Route::rule('hello/:name','hello')
	->middleware([Auth::class, 'Check']);

同じ追加パラメータを渡すこともできます

Route::rule('hello/:name','hello')
	->middleware(['auth', 'check'], 'admin');

または、異なるパラメータを指定して個別に複数回呼び出すこともできます

Route::rule('hello/:name','hello')
	->middleware('auth', 'admin')
        ->middleware('hello', 'thinkphp');

必要に応じてグローバル実行するルーティング ミドルウェア (ルートが一致するかどうかに関係なく) をルートに定義する必要はありません。ルーティング設定ファイルに直接定義できます。たとえば、次のように追加します。 config/route.php 設定ファイルに追加すると、以下のすべてのアプリケーションのすべてのリクエストが Auth および Check ミドルウェアを実行します。

クロージャを使用してミドルウェアを定義する

ミドルウェア クラスを使用する必要はありません。単純な状況では、クロージャを使用してミドルウェアを定義できますが、クロージャはパッケージ関数ですResponse オブジェクトのインスタンスを返す必要があります。

'middleware'    =>    [
    app\middleware\Auth::class,
    app\middleware\Check::class,
],

コントローラ ミドルウェア


コントローラのミドルウェアの定義をサポートします。コントローラでミドルウェア属性を定義するだけで済みます。例:

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

認証ミドルウェアはインデックス コントローラの実行時に呼び出され、完全な名前空間定義の使用もサポートされます。

コントローラーの途中で有効な操作を設定する必要がある場合は、次のように定義できます。

<?php
namespace app\controller;

class Index
{
    protected $middleware = ['auth'];

    public function index()
    {
        return 'index';
    }

    public function hello()
    {
        return 'hello';
    }
}

ミドルウェアはパラメーターをコントローラーに渡します

<?php
namespace app\controller;


class Index
{
    protected $middleware = [ 
    	'auth' 	=> ['except' 	=> ['hello'] ],
        'check' => ['only' 		=> ['hello'] ],
    ];

    public function index()
    {
        return 'index';
    }

    public function hello()
    {
        return 'hello';
    }
}

などのオブジェクト割り当てによってリクエストの Pass パラメーターをコントローラー (または他の場所) に渡し、

<?php

namespace app\middleware;

class Hello
{
    public function handle($request, \Closure $next)
    {
        $request->hello = 'ThinkPHP';
        
        return $next($request);
    }
}

実行優先度

を使用できます。 # コントローラー メソッド内で直接 ##ミドルウェアの実行順序に厳密な要件がある場合は、ミドルウェアの実行優先度を定義できます。構成ファイルに

public function index(Request $request)
{
	return $request->hello; // ThinkPHP
}

を追加します