ミドルウェアは、アプリケーションに入る HTTP リクエストを検査およびフィルタリングするための便利なメカニズムを提供します。 たとえば、Lithe には、ユーザーが認証されているかどうかを確認するミドルウェアが含まれています。そうでない場合、ミドルウェアはユーザーをログイン画面にリダイレクトします。ユーザーが認証されると、ミドルウェアはリクエストの続行を許可します。
Lithe では、ミドルウェアは、アプリケーションの要求/応答サイクルにおける要求オブジェクト ($req)、応答オブジェクト ($res)、および $next 関数にアクセスできる関数です。 $next 関数は、呼び出されると、現在のスタック内の次のミドルウェアを呼び出します。
ミドルウェア関数は、アプリケーションへの受信 HTTP リクエストを検査、フィルタリング、操作するための便利な方法を提供します。彼らは次のことができます:
現在のミドルウェアが要求と応答のサイクルを終了しない場合は、$next() を呼び出して次のミドルウェアに制御を渡す必要があります。それ以外の場合、リクエストは保留されたままになります。
次のコードは、ミドルウェア関数の要素を示しています。
$app->use(function ($req, $res, $next) { $next(); });
場所:
これは、myLogger というミドルウェアの簡単な例です。このミドルウェアは、リクエストが通過するたびにメッセージ LOGGED を出力します。これは、myLogger:
という変数に割り当てられる関数として定義されています。
$myLogger = function ($req, $res, $next) { echo 'LOGGED'; $next(); };
上記の $next() 呼び出しに注目してください。この関数は、アプリケーション内の次のミドルウェアを呼び出します。 $next() は組み込みの PHP 関数や Lithe 関数ではありませんが、ミドルウェア関数に渡される 3 番目の引数です。 $next() には任意の名前を付けることができますが、慣例により常に「next」と呼ばれます。混乱を避けるために、この規則に従ってください。
ミドルウェアは、HTTP リクエストがアプリケーションに到達する前に通過する一連の「レイヤー」であると想像してください。各レイヤーはリクエストを検査または拒否できます。
ミドルウェアをロードするには、ミドルウェア関数を指定して、LitheApp クラスの use() メソッドを呼び出します。例:
$app = new \Lithe\App; $myLogger = function ($req, $res, $next) { echo 'LOGGED'; $next(); }; $app->use($myLogger); $app->get('/', function ($req, $res, $next) { $res->send('Hello World!'); });
アプリがリクエストを受信するたびに、「LOGGED」というメッセージが出力されます。ミドルウェアのロード順序は重要です。最初にロードされたものが最初に実行されます。
myLogger ミドルウェアは単にメッセージを出力し、$next() を使用してリクエストを次のミドルウェアに渡します。
Lithe アプリケーションは次のタイプのミドルウェアを使用できます:
use() または METHOD() メソッドを使用して、アプリケーション レベルのミドルウェアをアプリケーションのインスタンスにアタッチします。ここで、METHOD は小文字の HTTP メソッド (GET、PUT、POST など) を指します。
この例は、パスのないミドルウェアを示しています。ミドルウェアはリクエストを受信するたびに実行されます:
$app->use(function ($req, $res, $next) { $next(); });
以下の例では、ミドルウェアはパス /user/:id:
への GET リクエストを処理します。
$myLogger = function ($req, $res, $next) { echo 'LOGGED'; $next(); };
ルーター レベルのミドルウェアはアプリケーション レベルのミドルウェアと同様に機能しますが、LitheHttpRouter のインスタンスにアタッチされます:
$app = new \Lithe\App; $myLogger = function ($req, $res, $next) { echo 'LOGGED'; $next(); }; $app->use($myLogger); $app->get('/', function ($req, $res, $next) { $res->send('Hello World!'); });
use() 関数と METHOD() 関数を使用してルーターレベルのミドルウェアをロードします。
ルーターレベルのミドルウェアの例を次に示します:
$app->use(function ($req, $res, $next) { echo 'Hello World!'; $next(); });
サードパーティのミドルウェアを使用して、Lithe アプリケーションに機能を追加できます。必要な PHP モジュールをインストールし、アプリケーションまたはルーター レベルでロードします。
LitheMiddlewareSessionsession を使用してセッション ミドルウェアをロードする例を次に示します:
$app->get('/user/:id', function ($req, $res, $next) { if ($req->param('id') === '0') { return $next(); } $res->send('ID is not 0'); }, function ($req, $res) { $res->send('regular'); });
Lithe で一般的に使用されるサードパーティのミドルウェアのリストについては、サードパーティのミドルウェア リソースを確認してください。
ミドルウェアを構成可能にする必要がある場合は、オプションの配列またはその他のパラメーターを受け入れ、それらのパラメーターに基づいてミドルウェア実装を返す関数を作成できます。以下の例を参照してください:
$router = new \Lithe\Http\Router;
これで、カスタム構成でミドルウェアを使用できるようになります:
$router = new \Lithe\Http\Router; $router->use(function ($req, $res, $next) { echo 'Time: ', Date('H:i:s'), '<br>'; $next(); }); $router->get('/user/:id', function ($req, $res, $next) { if ($req->param('id') === '0') { $res->redirect('/'); } $next(); }, function ($req, $res) { echo $req->param('id'); $res->render('special'); }); $app->use('/api', $router);
他の開発者が Composer 経由でインストールできるミドルウェアを作成するには、lithemod/flow というパッケージがあります。 Lithe で HTTP リクエストとレスポンスを処理するためのインターフェイスとユーティリティを提供し、さまざまなアプリケーションですぐに使用できる標準化されたミドルウェアの作成を容易にします。
lithemod/flow は、リクエストとレスポンスの統合インターフェイスを提供することで、堅牢なミドルウェアの構築を支援し、開発をより効率的かつ組織化します。これにより、ミドルウェアの他のプロジェクトへの統合が簡素化され、コードが一貫した標準に準拠することが保証されます。
以上がLithe のミドルウェア: その仕組みと独自のミドルウェアを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。