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