Laravel 8.x リクエストのライフサイクル

イントロダクション

「現実の世界」でツールを使用するとき、そのツールがどのように機能するかを理解していれば、より自信を感じられます。アプリケーション開発も例外ではありません。開発ツールがどのように機能するかを理解すると、それらをより快適に、自信を持って使用できるようになります。

このドキュメントの目的は、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メソッドを呼び出します。

サービスプロバイダは、データベース、キュー、バリデーション、ルーティングコンポーネントなど、フレームワークのさまざまなコンポーネントすべてを初期起動する責務を持っています。Laravelが提供する基本的なすべての主機能は、サービスプロバイダによって初期起動および設定されます。フレームワークによって提供される非常に多くの機能を初期起動し設定するため、サービスプロバイダはLaravel初期起動プロセス全体の最も重要な側面です。

bootメソッドを呼び出す前に、すべてのサービスプロバイダのregisterメソッドを呼び出すのはなぜか疑問に思われるかもしれません。答えは簡単です。すべてのサービスプロバイダのregisterメソッドを最初に呼び出すことにより、サービスプロバイダは、bootメソッドが実行されるまでに登録され利用可能になるすべてのコンテナ結合へ依存できるのです。

ルート

アプリケーションで最も重要なサービスプロバイダの1つは、App\Providers\RouteServiceProviderです。このサービスプロバイダは、アプリケーションのroutesディレクトリ内に含まれるルートファイルをロードします。どうぞRouteServiceProviderコードを開いて解析し、それがどのように機能するかを確認してください!

アプリケーションが初期起動され、すべてのサービスプロバイダが登録されると、Requestがルータに渡されてディスパッチされます。ルータは、ルートまたはコントローラへリクエストをディスパッチし、ルート固有のミドルウェアを実行します。

ミドルウェアは、アプリケーションに入るHTTPリクエストをフィルタリングまたは検査するための便利なメカニズムを提供しています。たとえば、Laravelには、アプリケーションのユーザーが認証されているかを確認するミドルウェアが含まれています。ユーザーが認証されていない場合、このミドルウェアはユーザーをログイン画面にリダイレクトします。そしてユーザーが認証されている場合、ミドルウェアはリクエストをアプリケーションへ進めることを許可します。HTTPカーネルの$middlewareプロパティで定義されているもののように、アプリケーション内のすべてのルートで適用されるミドルウェアもあれば、特定のルートまたはルートグループにのみ割り当てられるミドルウェアもあります。ミドルウェアの詳細については、完全なミドルウェアのドキュメントを参照してください。

リクエストが一致したルートへ割り当てられたすべてのミドルウェアをパスした場合は、ルートまたはコントローラメソッドが実行され、ルートまたはコントローラメソッドが返すレスポンスがルートのミドルウェアチェーンを介して返送されます。

最後

ルートまたはコントローラメソッドがレスポンスを返すと、レスポンスはルートのミドルウェアを介して外側に戻り、アプリケーションに送信レスポンスを変更または検査する機会を与えます。

最後に、レスポンスがミドルウェアを経由して戻ると、HTTPカーネルのhandleメソッドがレスポンスオブジェクトを返し、index.phpファイルが返ってきたレスポンスに対してsendメソッドを呼び出します。sendメソッドは、レスポンスコンテンツをユーザーのWebブラウザに送信します。Laravelリクエストのライフサイクル全体の旅を終えました!

サービスプロバイダに注目

サービスプロバイダは、Laravelアプリケーションを初期起動するための真の鍵です。アプリケーションインスタンスが作成され、サービスプロバイダが登録され、リクエストが初期起動を終えたアプリケーションに渡されます。とても簡単です!

Laravelアプリケーションがどのように構築され、サービスプロバイダを介して初期起動されるかをしっかりと把握することは非常に価値があります。アプリケーションのデフォルトのサービスプロバイダは、app/Providersディレクトリに保存されます。

デフォルトのAppServiceProviderはほとんど空です。このプロバイダは、アプリケーション独自の初期起動処理およびサービスコンテナ結合を追加するのに最適な場所です。大規模なアプリケーションの場合、アプリケーションで使用する特定のサービスに対して、それぞれがよりきめ細かい初期処理を備えた複数のサービスプロバイダを作成することをお勧めします。

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる