Skip to content

リクエストライフサイクル

はじめに

「現実世界」のどんなツールを使うにしても、そのツールがどのように動作するかを理解していると、より自信を持って使えます。アプリケーション開発も同じです。開発ツールがどのように機能するかを理解していると、すべてがより「魔法のよう」ではなくなり、アプリケーションを構築する際により自信を持てるようになります。

このドキュメントの目的は、Laravelフレームワークがどのように動作するかについて、良い、高レベルの概要を提供することです。フレームワーク全体をよりよく理解することで、すべてがより「魔法のよう」ではなくなり、アプリケーションを構築する際により自信を持てるようになります。すべての用語をすぐに理解できなくても、落胆しないでください。何が起こっているかの基本的な理解を得るために努め、ドキュメントの他のセクションを調べるにつれて知識が増えていくでしょう。

ライフサイクルの概要

最初のステップ

Laravelアプリケーションへのすべてのリクエストのエントリポイントは、public/index.phpファイルです。すべてのリクエストは、Webサーバー(Apache/Nginx)の設定によってこのファイルに向けられます。index.phpファイルにはあまりコードが含まれていません。むしろ、フレームワークの残りの部分をロードするための出発点です。

index.phpファイルは、Composerが生成したオートローダー定義をロードし、次にbootstrap/app.phpからLaravelアプリケーションのインスタンスを取得します。Laravel自体が最初に行うアクションは、アプリケーション/サービスコンテナのインスタンスを作成することです。

HTTP / コンソールカーネル

次に、入ってくるリクエストは、アプリケーションに入るリクエストのタイプに応じて、HTTPカーネルまたはコンソールカーネルのいずれかに送られます。これらのカーネルは、すべてのリクエストが流れる中心の場所として機能します。今のところ、HTTPカーネルに焦点を当てましょう。これは、Illuminate\Foundation\Http\Kernelのインスタンスです。

HTTPカーネルは、リクエストが実行される前に実行されるbootstrappersの配列を定義します。これらのブートストラッパーは、エラー処理の設定、ログの設定、アプリケーション環境の検出、およびリクエストが実際に処理される前に実行する必要があるその他のタスクを行います。通常、これらのクラスは、ユーザーが気にする必要のない内部のLaravel設定を処理します。

HTTPカーネルは、アプリケーションのミドルウェアスタックを通じてリクエストを渡す責任もあります。これらのミドルウェアは、HTTPセッションの読み書き、アプリケーションがメンテナンスモードかどうかの判定、CSRFトークンの検証などを行います。これらについては後で詳しく説明します。

HTTPカーネルのhandleメソッドのシグネチャは非常にシンプルです:Requestを受け取り、Responseを返します。カーネルを、アプリケーション全体を表す大きなブラックボックスと考えてください。HTTPリクエストを与えると、HTTPレスポンスを返します。

サービスプロバイダ

カーネルのブートストラップアクションの中で最も重要なのは、アプリケーションのサービスプロバイダをロードすることです。サービスプロバイダは、データベース、キュー、バリデーション、ルーティングなど、フレームワークのさまざまなコンポーネントをブートストラップする責任があります。

Laravelは、このプロバイダのリストを反復処理し、それぞれをインスタンス化します。プロバイダがインスタンス化された後、すべてのプロバイダに対してregisterメソッドが呼び出されます。その後、すべてのプロバイダが登録されると、各プロバイダのbootメソッドが呼び出されます。これは、プロバイダがbootメソッドが実行される時点で、すべてのコンテナバインディングが登録され、利用可能であることに依存できるようにするためです。

基本的に、Laravelが提供するすべての主要な機能は、サービスプロバイダによってブートストラップされ、設定されます。フレームワークが提供する機能の多くをブートストラップし、設定するため、サービスプロバイダはLaravelのブートストラッププロセス全体の中で最も重要な側面です。

フレームワーク内部では数十のサービスプロバイダが使用されていますが、独自のサービスプロバイダを作成することもできます。アプリケーションが使用しているユーザー定義またはサードパーティのサービスプロバイダのリストは、bootstrap/providers.phpファイルにあります。

ルーティング

アプリケーションがブートストラップされ、すべてのサービスプロバイダが登録されると、Requestはルーターに渡されてディスパッチされます。ルーターは、リクエストをルートまたはコントローラにディスパッチし、ルート固有のミドルウェアを実行します。

ミドルウェアは、アプリケーションに入るHTTPリクエストをフィルタリングまたは検査するための便利なメカニズムを提供します。例えば、Laravelには、アプリケーションのユーザーが認証されているかどうかを検証するミドルウェアが含まれています。ユーザーが認証されていない場合、ミドルウェアはユーザーをログイン画面にリダイレクトします。しかし、ユーザーが認証されている場合、ミドルウェアはリクエストがアプリケーションのさらに深くに進むことを許可します。一部のミドルウェアはアプリケーション内のすべてのルートに割り当てられますが、一部は特定のルートまたはルートグループにのみ割り当てられます。ミドルウェアの詳細については、ミドルウェアのドキュメントで学ぶことができます。

リクエストが一致したルートに割り当てられたすべてのミドルウェアを通過すると、ルートまたはコントローラメソッドが実行され、そこから返されたレスポンスがルートのミドルウェアチェーンを通じて返されます。

仕上げ

ルートまたはコントローラメソッドがレスポンスを返すと、レスポンスはルートのミドルウェアを通じて外側に戻り、アプリケーションが送信レスポンスを変更または検査する機会を与えられます。

最後に、レスポンスがミドルウェアを通じて戻ると、HTTPカーネルのhandleメソッドはレスポンスオブジェクトをアプリケーションインスタンスのhandleRequestに渡し、このメソッドは返されたレスポンスのsendメソッドを呼び出します。sendメソッドは、レスポンスコンテンツをユーザーのWebブラウザに送信します。これで、Laravelリクエストライフサイクル全体のプロセスが完了しました。

サービスプロバイダに注目

サービスプロバイダは、Laravelアプリケーションをブートストラップする際の本当の鍵です。アプリケーションインスタンスが作成され、サービスプロバイダが登録され、リクエストがブートストラップされたアプリケーションに渡されます。それは本当にそれだけです!

Laravelアプリケーションがどのように構築され、サービスプロバイダを介してブートストラップされるかについてしっかりと理解することは、非常に価値があります。アプリケーションのユーザー定義のサービスプロバイダは、app/Providersディレクトリに保存されます。

デフォルトでは、AppServiceProviderはほとんど空の状態です。このプロバイダは、アプリケーション自身のブートストラップとサービスコンテナのバインディングを追加するのに最適な場所です。大規模なアプリケーションの場合、アプリケーションで使用される特定のサービスのために、より細かい粒度のブートストラップを持つ複数のサービスプロバイダを作成することをお勧めします。

ユーザーノート