リクエストのライフサイクル
イントロダクション
「実社会」でどんなツールを使うにしても、そのツールがどのように機能するかを理解していれば、より自信を持って使えます。アプリケーション開発も同じです。開発ツールがどのように機能するかを理解すれば、より快適に、自信を持ってツールを使えるようになります。
このドキュメントの目的は、Laravelフレームワークがどのように機能するかについて、分かりやすい高レベルの概要を説明することです。フレームワーク全体をよりよく知ることで、すべてが「魔法」のように感じなくなり、より自信を持ってアプリケーションを構築できるようになるでしょう。もし、すぐにすべての用語を理解できなくても、がっかりしないでください!何が起こっているのかを基本的に把握しようと努めれば、ドキュメントの他のセクションを読み進めるにつれて知識は深まっていきます。
ライフサイクルの概要
最初のステップ
Laravelアプリケーションへのすべてのリクエストのエントリポイントは、public/index.phpファイルです。すべてのリクエストは、Webサーバ(Apache/Nginx)の設定によってこのファイルに送られます。index.phpファイルには、多くのコードは含まれていません。むしろ、フレームワークの残りの部分をロードするための開始点です。
index.phpファイルは、Composerが生成したオートローダー定義をロードし、次にbootstrap/app.phpからLaravelアプリケーションのインスタンスを取得します。Laravel自身が最初に行うアクションは、アプリケーション/サービスコンテナのインスタンスを作成することです。
HTTP/コンソールカーネル
次に、受信リクエストは、アプリケーションに入ってくるリクエストの種類に応じて、アプリケーションインスタンスのhandleRequestまたはhandleCommandメソッドを使い、HTTPカーネルかコンソールカーネルのいずれかに送信されます。この2つのカーネルは、すべてのリクエストが通過する中心的な場所として機能します。ここでは、Illuminate\Foundation\Http\KernelのインスタンスであるHTTPカーネルに焦点を当ててみましょう。
HTTPカーネルは、リクエストが実行される前に実行される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メソッドは、レスポンスのコンテンツをユーザーのWebブラウザに送信します。これで、Laravelのリクエストライフサイクル全体の旅が完了しました!
サービスプロバイダへの注目
サービスプロバイダは、Laravelアプリケーションをブートストラップするための真の鍵です。アプリケーションインスタンスが作成され、サービスプロバイダが登録され、リクエストがブートストラップされたアプリケーションに渡されます。本当にこれだけ、シンプルなのです!
Laravelアプリケーションがどのように構築され、サービスプロバイダを介してブートストラップされるかをしっかりと把握しておくことは非常に価値があります。アプリケーションのユーザー定義サービスプロバイダは、app/Providersディレクトリに保存されています。
デフォルトでは、AppServiceProviderはほとんど空です。このプロバイダは、アプリケーション独自のブートストラップやサービスコンテナへの結合を追加するのに最適な場所です。大規模なアプリケーションでは、アプリケーションが使用する特定のサービスに対して、より粒度の細かいブートストラップを持つサービスプロバイダをいくつか作成するとよいでしょう。