Request Lifecycle
Introduction
「現実世界」でツールを使用するとき、そのツールがどのように機能するかを理解していれば、より自信が持てるようになります。アプリケーション開発も同様です。開発ツールがどのように機能するかを理解すると、より快適に、自信を持って開発ツールを使用できるようになります。
このドキュメントの目的は、Laravel フレームワークがどのように機能するかについての概要をわかりやすく説明することです。全体的なフレームワークをより深く理解することで、すべてが「魔法」のように感じられなくなり、より自信を持ってアプリケーションを構築できるようになります。用語のすべてをすぐに理解できなくても、がっかりしないでください。何が起こっているのかを基本的に理解するように努めてください。ドキュメントの他のセクションを調べるにつれて知識が深まります。
Lifecycle Overview
First Steps
Laravel アプリケーションへのすべてのリクエストのエントリ ポイントは、public/index.php ファイルです。すべてのリクエストは、Web サーバー (Apache / Nginx) 構成によってこのファイルに送信されます。 index.php ファイルには多くのコードは含まれていません。むしろ、これはフレームワークの残りの部分をロードするための開始点です。
index.php ファイルは、Composer で生成されたオートローダー定義をロードし、bootstrap/app.php から Laravel アプリケーションのインスタンスを取得します。 Laravel 自体によって実行される最初のアクションは、アプリケーション / service container のインスタンスを作成することです。
HTTP / Console Kernels
次に、受信リクエストは、アプリケーションに入るリクエストのタイプに応じて、HTTP カーネルまたはコンソール カーネルのいずれかに送信されます。これら 2 つのカーネルは、すべてのリクエストが通過する中心的な場所として機能します。ここでは、app/Http/Kernel.php にある HTTP カーネルに注目してみましょう。
HTTP カーネルは、リクエストが実行される前に実行される bootstrappers の配列を定義する Illuminate\Foundation\Http\Kernel クラスを拡張します。これらのブートストラップは、エラー処理の構成、ロギング、detect the application environment の構成、およびリクエストが実際に処理される前に実行する必要があるその他のタスクを実行します。通常、これらのクラスは、心配する必要のない内部 Laravel 設定を処理します。
HTTP カーネルは、アプリケーションによって処理される前にすべてのリクエストが通過する必要がある HTTP middleware のリストも定義します。これらのミドルウェアは、HTTP session の読み取りと書き込みを処理し、アプリケーションがメンテナンス モードや verifying the CSRF token であるかどうかを判断します。これらについては、後ほど詳しく説明します。
HTTP カーネルの handle メソッドのメソッド シグネチャは非常に単純です。Request を受け取り、Response を返します。カーネルは、アプリケーション全体を表す大きなブラック ボックスであると考えてください。 HTTP リクエストを入力すると、HTTP レスポンスが返されます。
Service Providers
最も重要なカーネル ブートストラップ アクションの 1 つは、アプリケーションの service providers をロードすることです。アプリケーションのすべてのサービスプロバイダは、config/app.php 構成ファイルの providers 配列で構成されます。
Laravel は、このプロバイダのリストを反復処理し、それぞれをインスタンス化します。プロバイダをインスタンス化した後、すべてのプロバイダで register メソッドが呼び出されます。次に、すべてのプロバイダが登録されると、boot メソッドが各プロバイダで呼び出されます。これは、サービスプロバイダが、boot メソッドが実行されるまでに登録され、利用可能になっているすべてのコンテナー バインディングに依存できるようにするためです。
サービスプロバイダは、データベース、キュー、検証、ルーティング コンポーネントなど、フレームワークのさまざまなコンポーネントをすべてブートストラップする責任があります。基本的に、Laravel が提供するすべての主要な機能は、サービスプロバイダによってブートストラップされ、設定されます。サービスプロバイダは、フレームワークによって提供される非常に多くの機能をブートストラップして構成するため、Laravel ブートストラッププロセス全体の最も重要な側面となります。
Routing
アプリケーションで最も重要なサービスプロバイダの 1 つは、App\Providers\RouteServiceProvider です。このサービスプロバイダは、アプリケーションの routes ディレクトリ内に含まれるルート ファイルをロードします。さあ、RouteServiceProvider コードを解いて、それがどのように機能するかを見てみましょう。
アプリケーションがブートストラップされ、すべてのサービスプロバイダが登録されると、Request がディスパッチのためにルーターに渡されます。ルーターはリクエストをルートまたはコントローラにディスパッチし、ルート固有のミドルウェアを実行します。
ミドルウェアは、アプリケーションに入る HTTP リクエストをフィルタリングまたは検査するための便利なメカニズムを提供します。たとえば、Laravel には、アプリケーションのユーザーが認証されているかどうかを検証するミドルウェアが含まれています。ユーザーが認証されていない場合、ミドルウェアはユーザーをログイン画面にリダイレクトします。ただし、ユーザーが認証されている場合、ミドルウェアはリクエストがアプリケーション内にさらに進むことを許可します。ミドルウェアの中には、HTTP カーネルの $middleware プロパティで定義されているものなど、アプリケーション内のすべてのルートに割り当てられるものもありますが、特定のルートまたはルート グループにのみ割り当てられるものもあります。 middleware documentation を完全に読むことで、ミドルウェアの詳細を学ぶことができます。
リクエストが、一致したルートに割り当てられたすべてのミドルウェアを通過する場合、ルートまたはコントローラ メソッドが実行され、ルートまたはコントローラ メソッドによって返された応答は、ルートのミドルウェア チェーンを通じて送り返されます。
Finishing Up
ルートまたはコントローラ メソッドが応答を返すと、その応答はルートのミドルウェアを介して外向きに戻り、アプリケーションに送信される応答を変更または検査する機会が与えられます。
最後に、応答がミドルウェアを経由して戻ってくると、HTTP カーネルの handle メソッドは応答オブジェクトを返し、index.php ファイルは返された応答に対して send メソッドを呼び出します。 send メソッドは、応答コンテンツをユーザーの Web ブラウザーに送信します。 Laravel リクエストのライフサイクル全体にわたる旅が終わりました。
Focus On Service Providers
サービスプロバイダは、まさにLaravelアプリケーションをブートストラップするための鍵となります。アプリケーション インスタンスが作成され、サービスプロバイダが登録され、リクエストがブートストラップされたアプリケーションに渡されます。本当に簡単です!
Laravel アプリケーションがどのように構築され、サービスプロバイダを介してブートストラップされるかをしっかりと把握することは非常に価値があります。アプリケーションのデフォルトのサービスプロバイダは、app/Providers ディレクトリに保存されます。
デフォルトでは、AppServiceProvider はかなり空です。このプロバイダは、アプリケーション独自のブートストラップとサービスコンテナー バインディングを追加するのに最適な場所です。大規模なアプリケーションの場合は、複数のサービスプロバイダを作成し、それぞれのサービスプロバイダで、アプリケーションで使用される特定のサービスをより詳細にブートストラップすることができます。