Slimフレームワーク アプリケーション ライフサイクル

Webアプリケーションの本質はシンプルです。HTTPリクエストを受け取り、適切なコードを実行し、HTTPレスポンスを返します。Slimフレームワークは、シンプルで使いやすいインターフェースの下に、前提となるアプリケーションの基礎部分を隠すことで、小規模なWebアプリケーションやAPIの構築と起動を非常に簡単にします。しかし、低レベルの詳細に興味がある方のために、Slimアプリケーションのライフサイクルが最初から最後までどのように見えるかを以下に示します。

インスタンス化

インスタンス化されると、Slimは現在のHTTPリクエストへのシンプルなインターフェースを提供するRequestオブジェクトを作成します。SlimはResponseオブジェクトも作成します。デフォルトでは、ResponseオブジェクトはHTML形式で200 OKレスポンスを返します。Responseオブジェクトは、クライアントに返されるHTTPレスポンスのステータスコード、コンテンツタイプ、および本文を決定します。

RequestオブジェクトとResponseオブジェクトが作成された後、SlimはRouterオブジェクトとViewオブジェクトを作成します。Routerオブジェクトは、Slimアプリケーションのルートを整理します。Viewオブジェクトは、HTTPレスポンス本文として使用されるテンプレートコンテンツをレンダリングします。最後に、SlimはPHPセッションがまだ開始されていない場合に開始します。

RouterオブジェクトとViewオブジェクトは、背後で動作します。RequestオブジェクトとResponseオブジェクトは通常、コントローラーコードに直接関係し、アプリケーションのどこからでもそれぞれ$app->request()$app->response()でアクセスできます。

ルート定義

インスタンス化後、Slimアプリケーションのルートが定義されます。ルートは、URI、コントローラーコード、およびルートが応答する1つ以上のHTTPメソッドを含むコレクションです。

$app = new Slim(); $app->get('/foo', function () {
    //Controller code
});
$app->run();

この例は、URI「/foo」をHTTP GETリクエストの特定のコントローラーコードにマッピングするルートを示しています。$app->get()$app->post()$app->put()$app->delete()$app->options()、または$app->map() Slimアプリケーションインスタンスメソッドを使用して、それぞれのHTTPリクエストメソッドに応答するアプリケーションルートを定義できます。

これらのSlimアプリケーションインスタンスメソッドの1つがルートを定義するために呼び出されると、Routerオブジェクトは、指定されたURIを、ルートオブジェクトの形式で、指定されたHTTPリクエストメソッドの特定のコントローラーコードに関連付けます。

Routerによって返される結果のルートオブジェクトは、$route->name()$route->conditions()$route->via()などのチェーン可能なメソッドを提供し、Slimアプリケーションが実行される前にルートオブジェクトをさらにカスタマイズできます。

アプリケーションの実行

アプリケーションルートが定義された後、$app->run()メソッドが呼び出されてSlimアプリケーションが開始されます。 Slimは新しい出力バッファを作成し、`run()`メソッドの実行中に`echo()`されたコンテンツ(つまり、ルートのコントローラーコードまたはミドルウェアからのコンテンツ)をキャプチャします。 Slimは、$app->applyHook()を使用して、実行メソッド全体で断続的なフックでミドルウェアを呼び出します。これにより、開発者は実行ループの指定されたポイントでキューに入れられたコールバックを呼び出すことができます。

次に、Slimは現在のHTTPリクエストのURIに一致するすべてのルートオブジェクトをループ処理します。 Routerオブジェクトはforeachループで直接使用されます。これは、RouterがIteratorAggregateインターフェースを実装し、foreachループなどの反復コンテキストから呼び出されたときにArrayIteratorオブジェクトを返すためです。

Routerは各ルートオブジェクトに、現在のHTTPリクエストURIと一致するかどうかを問い合わせます。問い合わせられると、ルートオブジェクトは、オプションのパラメーターまたはパラメーター条件を考慮して、パターン(例:/hello/:first/:last)を正規表現にコンパイルします。 HTTPリクエストURIが結果のルート正規表現と一致する場合、Routerはルートオブジェクトを実行ループで反復処理するために返される一致するルートの配列に追加します。

各ルートオブジェクトは、どのHTTPメソッドに応答するかを知っています。各反復ループについて、現在のルートオブジェクトが現在のHTTPリクエストメソッドに応答する場合、Slimはルートのコントローラーコードを呼び出します。ただし、現在のルートオブジェクトが現在のHTTPリクエストメソッドに応答しない場合、現在のルートオブジェクトが応答するメソッドは$httpMethodsAllowed配列に追加されます(後でSlimが405 Method Not Allowed HTTPレスポンスを返す場合に使用されます)。

ルートオブジェクトが現在のHTTPリクエストメソッドに応答し、ルートのコントローラーの呼び出し中に例外がスローされない場合、Slimはルートの反復ループから抜け出し、現在の出力バッファのコンテンツをResponseオブジェクトのbodyプロパティに追加します。

ルートがHTTPリクエストURIと一致するがHTTPリクエストメソッドと一致しない場合、Slimは、一致するルートが応答するHTTPメソッドをリストするAllowヘッダーを含む405 Method Not Allowed HTTPレスポンスを返します。

HTTPリクエストURIと一致するルートがない場合、SlimはアプリケーションのNot Foundハンドラーを呼び出し、404 Not Foundレスポンスを返します。 Not Foundハンドラーはルートと同じように動作します。出力バッファに送信するコンテンツは、Responseオブジェクトのbodyに追加されます。

ルートの反復が完了し、Responseオブジェクトが準備されると、SlimはFlashメッセージを永続化し、ResponseオブジェクトをHTTPクライアントに配信する前に$_SESSIONデータをセッションデータストアにフラッシュします。