イントロダクション
「現実の世界」でツールを使用する場合、その道具がどのように動作するかを理解しておいたほうが、自信が持てます。アプリケーションの開発も違いはありません。開発ツールがどのように働くのかを理解すれば、より快適に自信を持って使用できるのです。
このドキュメントの目的は、どのようにLaravelが「働いて」いるのか、ハイレベルな概念を理解してもらうためです。フレームワークの概念をより良く知ってもらうことで、全てに対し「不可解さ」が減り、より自信を持ってアプリケーションを開発してもらえます。
これらの言葉を今すぐ理解できなくても、気落ちしないで下さい。ただ、何が行われているかを理解するための基本だけを理解してください。ドキュメントの他のセクションで明確にされる内容を理解すれば、知識は育っていくことでしょう。
概論
始まり
アプリケーションに対するリクエストは、全てpublic/index.php
ファイルが入り口になります。Webサーバー(Apache/Nginx)の設定により、全てのリクエストをこのファイルへ渡しています。index.php
ファイルは、さほどコードを持っていません。フレームワークの残りをロードするための入り口にすぎません。
index.php
ファイルは、コンポーサーが生成したオートローダーの定義をロードします。それから、bootstrap/app.php
スクリプトから、Laravelアプリケーションのインスタンスを取得します。Laravel自身の最初のアクションは、アプリケーション/サービスコンテナのインスタンスを生成することです。
HTTP/Consoleカーネル
次に、アプリケーションが起動された種類により、送信されてきたリクエストをHTTPカーネルか、コンソールカーネルのどちらかに送ります。これらのカーネルは、全リクエストフローの中心に位置し動作します。ここではapp/Http/Kernel.php
にある、HTTPカーネルに焦点を合わせます。
HTTPカーネルはIlluminate\Foundation\Http\Kernel
クラスを拡張しており、リクエストの実行前に処理されるbootstrappers(起動コード)の配列を定義しています。これらの起動コードはエラー処理、ログ設定、アプリケーション環境の決定、その他実際にリクエストが処理される前に行う必要のあるタスクです。
HTTPカーネルはさらに、アプリケーションによりリクエストが処理される前に通す必要のある、HTTPミドルウェアのリストも定義しています。これらのミドルウェアはHTTPセッションの読み書き、アプリケーションがメンテナンスモードであるかの決定、CSRFトークンの確認などを行います。
HTTPカーネルのhandle
メソッドの使い方はとてもシンプルで、Request
を受け取り、Response
をリターンします。カーネルをアプリケーション全体を表す大きなブラックボックスだと考えてください。HTTPリクエストを流し込み、HTTPレスポンスが返ってきます。
サービスプロバイダー
カーネルの初期処理で重要な働きのひとつは、アプリケーションのサービスプロバイダーをロードすることです。アプリケーションの全サービスプロバイダーは、config/app.php
ファイルのproviders
配列で設定されています。最初に、全プロバイダーのregister
メソッドが呼び出され、その後に登録されている全プロバイダーのboot
メソッドが呼び出されます。
リクエストのディスパッチ
アプリケーションの初期処理が済み、全サービスプロバイダーが登録されたら、ディスパッチするためにルーターへRequest
が手渡されます。ルーターはそのリクエストをルートかコントローラーにディスパッチし、その時にルートに指定されているミドルウェアも実行されます。
サービスプロバイダーの精査
サービスプロバイダーは、Laravelアプリケーションの初期起動段階における、まさに鍵となるものです。アプリケーションインスタンスが作成され、サービスプロバイダーが登録され、初期起動を終えたアプリケーションでリクエストが処理されます。とてもシンプルです!
Laravelアプリケーションがどう構築されているか、そしてサービスプロバーイダーによる初期起動の仕組みをしっかりと把握することは、とても重要です。もちろん、皆さんのアプリケーションのためのデフォルトサービスプロバイダーは、app/Providers
ディレクトリーに設置されています。
AppServiceProvider
は、デフォルトで全く空っぽです。このプロバイダーは、皆さんのアプリケーション自身の初期起動やサービスコンテナの結合を追加するために用意されています。もちろん、大きなアプリケーションであれば、まとまった初期起動種別ごとに分け、好きなだけのサービスプロバイダーを作成できます。