メインコンテンツまでスキップ

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

はじめに

「現実世界」でどんなツールを使うにしても、そのツールがどのように動作するかを理解していると、より自信を持つことができます。アプリケーション開発も同様です。開発ツールの動作原理を理解すると、そのツールを使用する際により快適で自信を持つことができます。

このドキュメントの目的は、Laravelフレームワークの動作の概要を提供することです。全体的なフレームワークをよりよく理解することで、すべてが「魔法」であるように感じず、アプリケーションの構築に対してより自信を持つことができます。すべての用語をすぐに理解できなくても心配しないでください!単に何が起こっているかを基本的に理解しようとして、他のドキュメントのセクションを探索することで知識が増えていきます。

ライフサイクルの概要

最初のステップ

Laravelアプリケーションへのすべてのリクエストの入り口は public/index.php ファイルです。すべてのリクエストは、Webサーバー(Apache / Nginx)の構成によってこのファイルに向けられます。index.php ファイルにはあまりコードが含まれていません。代わりに、フレームワークの残りの部分を読み込むための起点です。

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

HTTP / コンソールカーネル

次に、着信リクエストは、アプリケーションインスタンスの handleRequest または handleCommand メソッドを使用して、HTTPカーネルまたはコンソールカーネルに送信されます。これらの2つのカーネルは、すべてのリクエストが流れる中心的な場所として機能します。今のところ、HTTPカーネルに焦点を当ててみましょう。これは Illuminate\Foundation\Http\Kernel のインスタンスです。

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

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

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

サービスプロバイダ

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

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

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

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

ルーティング

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

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

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

終了

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

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

サービスプロバイダに焦点を当てる

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

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

デフォルトでは、AppServiceProviderはかなり空です。このプロバイダは、アプリケーション固有のブートストラップやサービスコンテナのバインディングを追加するのに最適な場所です。大規模なアプリケーションでは、アプリケーションで使用される特定のサービスのためにより細かいブートストラップを持つ複数のサービスプロバイダを作成することができます。