はじめに

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

この文書の目的は、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はかなり空です。このプロバイダーは、アプリケーションの独自のブートストラッピングとサービスコンテナバインディングを追加するのに最適な場所です。大規模なアプリケーションの場合、特定のサービスに対してより詳細なブートストラッピングを持つ複数のサービスプロバイダーを作成することをお勧めします。