概論

「現実の世界」でツールを使用する場合、その道具がどのように動作するかを理解しておいたほうが、自信が持てます。アプリケーションの開発も違いはありません。開発ツールがどのように働くのかを理解すれば、より快適に自信を持って使用できるのです。このドキュメントの目的は、どのように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オブジェクトがアプリケーションに渡されます。

では、まとめてみましょう。

  1. リクエストがpublic/index.phpファイルに入ってくる。
  2. bootstrap/start.phpファイルがアプリケーションを生成し、環境を決定する。
  3. framework/start.phpファイルが設定ファイルから設定を取り込み、サービスプロバイダーをロードする。
  4. アプリケーションがapp/start下のファイルをロードする。
  5. アプリケーションがapp/routes.phpファイルをロードする。
  6. Requestオブジェクトがアプリケーションに送られ、Responseオブジェクトを送り返す。
  7. Responseオブジェクトがクライアントに送り返される。

これで、Laravelアプリケーションでどのようにリクエストが処理されるか理解できたと思います。次に、"start"ファイル達をもっと詳しく見てみましょう。

スタートファイル

アプリケーションのスタートファイルはapp/startディレクトリーに設置されています。デフォルトでは3つがアプリケーションに含まれています。global.phplocal.phpartisan.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ファイルが混み合ってきたと感じたら、いくつかの初期化コードをサービスプロバイダーに移すことを考えて下さい。

アプリケーションイベント

アプリケーションイベントを登録する

また、リクエストの前後の処理を行うために、beforeafterfinishshutdownアプリケーションイベントを登録することができます。

App::before(function($request)
{
    //
});

App::after(function($request, $response)
{
    //
});

イベントのリスナーは、アプリケーションへのリクエストごとに、その前(before)、その後(after)に実行されます。 これらのイベントはグローバルなフィルタリングやレスポンスの変更に役に立ちます。startファイルやサービスプロバイダーで登録できます。

やってきたリクエストがルートに一致し、そのルートを実行する前に発行されるmatchedイベントのリスナーを登録することもできます。

Route::matched(function($route, $request)
{
    //
});

finishイベントはアプリケーションがクライアントへレスポンスを送り終えた後に呼び出されます。これはアプリケーションに「最後の瞬間」に行われることを期待する処理を行うために最適です。shutdownイベントは、全finishイベントハンドラーの処理が完了したすぐ後に呼び出されます。スクリプトの終了直前、何かを実行する最後のチャンスです。しかしながら、この2つのイベントを利用する必要はほとんど無いでしょう。