概論
「現実の世界」でツールを使用する場合、その道具がどのように動作するかを理解しておいたほうが、自信が持てます。アプリケーションの開発も違いはありません。開発ツールがどのように働くのかを理解すれば、より快適に自信を持って使用できるのです。このドキュメントの目的は、どのようにLaravelが「働いて」いるのかの素晴らしい、ハイレベルな概論を理解してもらうためです。フレームワークの概論をより良く知ってもらうことで、全てに対し「不可解さ」が減り、より自信を持ってアプリケーションを開発してもらえます。さらに、リクエストライフサイクルの高いレベルの概論を理解してもらうため、"start"ファイルとアプリケーションイベントも取り扱いましょう。
これらの言葉を今すぐ理解できなくても、気落ちしないで下さい。ただ、何が行われているかを理解するための基本だけを理解してください。ドキュメントの他のセクションで明確にされる内容を理解すれば、知識は育っていくことでしょう。
リクエストのライフサイクル
アプリケーションに対するリクエストはすべて、public/index.php
スクリプトを通して受け付けられます。Apacheを使用している場合であれば、最初からLaravelに含まれている.htaccess
ファイルが、index.php
に全リクエストを渡す処理を行っています。この時点で、Laravelはリクエストの処理を開始し初め、そしてクライアントへレスポンスを返します。Laravelの初期化の手順を全般的に理解することは役立ちますので、説明していきましょう!
Laravelの初期化の手順に関して、一番理解しておくべき重要点はサービスプロバイダーです。app/config/app.php
設定ファイルを開き、providers
配列を見てもらえば、サービスプロバイダーのリストを見つけることができます。これらのサービスプロバイダーが、Laravelの初期化メカニズムの重要点です。しかし、サービスプロバイダーを探る前に、index.php
へ戻りましょう。index.php
ファイルがリクエストを受け取ると、bootstrap/start.php
ファイルがロードされます。このファイルはIoCコンテナとしても動作する、Laravel
Application
オブジェクトを生成します。
Application
オブジェクトを生成したあと、プロジェクトのパスが設定され、環境の決定コードが実行されます。続いて、内部のLaravel初期化処理(bootstrap)スクリプトが呼び出されます。このファイルはLaravelのソースと深く関わっており、タイムゾーンのやエラーレポートのような設定ファイルに基づいた設定をいくつか行います。しかし、こうした追加の設定で重要なのは、些細なオプションの設定ではなく、アプリケーションの全サービスプロバイダーの登録です。
単純なサービスプロバイダーが持っているメソッドは、register
たった一つのみです。このregister
メソッドは、アプリケーションオブジェクト自身のregister
メソッドを通じ、アプリケーションがサービスプロバイダーを登録する時に呼び出されます。このメソッドにより、サービスプロバイダーはIoCコンテナを使い、色々登録します。重要なのは、それぞれのサービスプロバイダーがコンテナへ、アプリケーション内でサービスにアクセスするために結合されたクロージャーを一つ以上登録していることです。例えば、QueueServiceProvider
はキューに関連する様々なクラスを解決するために、クロージャーを登録しています。もちろん、サービスプロバイダーはどんな初期化コードも書くことができ、IoCコンテナへの登録だけに限りません。サービスプロバイダーでイベントのリスナー、ビューコンポーサー、Artisanコマンドなども登録できます。
すべてのサービスプロバイダーが登録し終えたら、app/start
ファイル達がロードされます。続いて、app/routes.php
ファイルがロードされます。routes.php
ファイルがロードされたら、ルートへ送り出すためにRequestオブジェクトがアプリケーションに渡されます。
では、まとめてみましょう。
- リクエストが
public/index.php
ファイルに入ってくる。 bootstrap/start.php
ファイルがアプリケーションを生成し、環境を決定する。framework/start.php
ファイルが設定ファイルから設定を取り込み、サービスプロバイダーをロードする。- アプリケーションが
app/start
下のファイルをロードする。 - アプリケーションが
app/routes.php
ファイルをロードする。 - Requestオブジェクトがアプリケーションに送られ、Responseオブジェクトを送り返す。
- Responseオブジェクトがクライアントに送り返される。
これで、Laravelアプリケーションでどのようにリクエストが処理されるか理解できたと思います。次に、"start"ファイル達をもっと詳しく見てみましょう。
スタートファイル
アプリケーションのスタートファイルはapp/start
ディレクトリーに設置されています。デフォルトでは3つがアプリケーションに含まれています。global.php
、local.php
、artisan.php
です。artisan.php
についての追加情報は、Artisanコマンドラインの章をご覧ください。
global.php
スタートファイルはデフォルトでは、いくつかの基本的な項目で構成されています。ログやapp/filters.php
ファイルのインクルードなどです。しかしながら、このファイルにご希望のものを何でも自由に付け加えて構いません。環境とは関係なく、アプリケーションに対する全てのリクエストで自動的にこのファイルをインクルードします。その一方、アプリケーションがlocal
環境で動作しているときにだけ、local.php
ファイルを呼び出します。環境についての追加情報は、ドキュメントの環境の章をご覧ください。
もちろん、local
に加え、別の環境を用意したら、同様にその環境用のスタートファイルを作成できます。アプリケーションがその環境で実行される時に、自動的に読み込みます。
ですから、例えば、bootstrap/start.php
ファイルの中で、development
という環境を設定したら、アプリケーションがその環境でリクエストを受け取った時に読み込まれる、app/start/development.php
ファイルを作成できます。
Startファイルへ何を設置するか
Startファイルへはどんな「初期化」コードでも、簡単に設置することができます。例えば、ビューコンポーサーやログの準備、PHPのセッティングなどを登録できます。何に使用するかは、皆さんにお任せしています。もちろん、すべての初期化コードをstartファイルへ投げ込んでしまえば、ぐちゃぐちゃになるでしょう。大きなアプリケーションを開発する場合や、startファイルが混み合ってきたと感じたら、いくつかの初期化コードをサービスプロバイダーに移すことを考えて下さい。
アプリケーションイベント
アプリケーションイベントを登録する
また、リクエストの前後の処理を行うために、before
、after
、finish
、shutdown
アプリケーションイベントを登録することができます。
App::before(function($request)
{
//
});
App::after(function($request, $response)
{
//
});
イベントのリスナーは、アプリケーションへのリクエストごとに、その前(before)、その後(after)に実行されます。
これらのイベントはグローバルなフィルタリングやレスポンスの変更に役に立ちます。start
ファイルやサービスプロバイダーで登録できます。
やってきたリクエストがルートに一致し、そのルートを実行する前に発行されるmatched
イベントのリスナーを登録することもできます。
Route::matched(function($route, $request)
{
//
});
finish
イベントはアプリケーションがクライアントへレスポンスを送り終えた後に呼び出されます。これはアプリケーションに「最後の瞬間」に行われることを期待する処理を行うために最適です。shutdown
イベントは、全finish
イベントハンドラーの処理が完了したすぐ後に呼び出されます。スクリプトの終了直前、何かを実行する最後のチャンスです。しかしながら、この2つのイベントを利用する必要はほとんど無いでしょう。