ライフサイクルとは「生まれてから死ぬまで」の一生を表す言葉ですが、プログラムやITの用語としても使われ、単純に「プログラムのスタートから終わりまで」を表します。Laravelフレームワークがリクエストを受け付け、レスポンスをクライアントに返すまでの流れ(ライフサイクル)を学ぶことで、Laravelの動きを把握しておきましょう。 今回の内容はhttps://readouble.com/laravel/6.x/ja/lifecycle.htmlのドキュメントから確認できます。

Laravelのライフサイクル

3年以上前に更新されました。情報が古い可能性があります。
更新日 : 2020年02月04日

ライフサイクルとは「生まれてから死ぬまで」の一生を表す言葉ですが、プログラムやITの用語としても使われ、単純に「プログラムのスタートから終わりまで」を表します。Laravelフレームワークがリクエストを受け付け、レスポンスをクライアントに返すまでの流れ(ライフサイクル)を学ぶことで、Laravelの動きを把握しておきましょう。

今回の内容はhttps://readouble.com/laravel/6.x/ja/lifecycle.htmlのドキュメントから確認できます。

リクエストからレスポンスまで

下の図を順番に解説します。

HTTPリクエストの受け付け

Laravelのディレクトリ構造について説明した際、Laravelを動作させるときにWEBサーバーで公開するべきディレクトリ(ドキュメントルート)はpublicディレクトリだけでした。その他のディレクトリは公開されません。その他のPHPファイルはどのように実行されるのでしょうか。

実は、PHPファイルをロードすることにより他のPHPファイルは実行されます。

Laravelへのリクエストはすべてpublic/index.phpへ送られます。これはWEBサーバーの設定で実現しています。

Laravelアプリケーション配下へのHTTPリクエストであればpublic/index.phpが必ず最初に実行されます。このindex.phpがLaravelのエントリーポイント(処理の始まり)です。

Laravelアプリケーションのインスタンス作成

public/index.phpではComposerでインストールしたライブラリを読み込んだあと、bootstrap/app.phpを読み込みます。このapp.phpではLaravelアプリケーションのインスタンスを作成しています。インスタンスを生成することにより、Laravelの各種機能を実行することができる準備が整います。

HTTPカーネルの読み込み

カーネルとは、機能の中枢という意味です。Laravelフレームワークは多機能なため、HTTPリクエストを処理するHTTPカーネルやサーバー内処理をおこなうConsoleカーネルなどいくつかのカーネルが存在します。

public/index.phpでLaravelアプリケーションインスタンスを生成後、HTTPカーネルを読み込みます。

HTTPカーネルからhandleの実行

HTTPカーネルはhandleメソッドを持っています。車のハンドルと同じような意味で、HTTPのリクエストをコントロールするメソッドです。handleメソッドの引数にHTTPリクエストのオブジェクトを入れることで、実行結果としてHTTPレスポンスのオブジェクトが返却されます

handleの中身

handleメソッドではHTTPリクエストオブジェクトを受け取り、様々な処理のあとHTTPレスポンスオブジェクトを返却します。

レスポンスが返却されるまでの「様々な処理」では何が行われているのでしょうか。

  1. サービスプロバイダの登録
    サービスプロバイダとは、Laravelの様々な機能を部品化したものを提供する機能です。これを登録することによりLaravelの様々な機能を利用できます。
  2. ルーターへの橋渡し
    サービスプロバイダの登録が完了したあとは、ルーターへリクエストを渡します。ルーターはURLに基づき、どのコントローラーを起動するかを決定します。コントローラーは最後にビューを返します。

handleメソッドでルーターに橋渡しをすると、最後にレスポンスが返却されます。ルーターの処理自体もサービスプロバイダで定義されています。

また、handleメソッドでルーターに橋渡しをする前に、ミドルウエアの処理も行います。

handleの実行結果をユーザーに送信

handleメソッドの実行が完了すると、HTTPレスポンスオブジェクトが返却されました。

あとはこのHTTPレスポンスオブジェクトをHTTPレスポンスとしてクライアントに送るだけです。オブジェクトをHTTPレスポンスとして送信するため、$response->send()メソッドを実行し、ライフサイクルは終了です。

まとめ

ライフサイクルについて説明しましたが、図のイメージだけでもしっかり理解しておきましょう。Laravelはそれぞれの機能が疎結合(結びつきが弱く、機能が独立していて改修やテストがしやすい)で作られているため、コードを理解するのは大変です。

大変ですが、理解できればかなり開発のしやすいフレームワークなので、柔軟性が高く、様々な機能を開発しやすいフレームワークとして人気です。

最後に特に大事な点をいくつか再度説明します。

  • public/index.phpがすべてのリクエストを受け付ける(エントリーポイント)
  • HTTPカーネルからhandleメソッドを実行し、ルーターやコントローラの処理へ移る
  • コントローラー内のメソッドがビューを返却し、最後にHTTPレスポンスを作成