この記事は、laravelリクエスト宣言サイクルに関する関連知識を提供します。リクエストのライフサイクルには、オートローダー、カーネル、サービスプロバイダー、リクエストとルーティングのスケジューリングなど、さまざまな用語があります。助けなければなりません。
Laravel は強力な PHP フレームワークです。laravel フレームワークを学ぶときは、Laravel リクエストのライフサイクルが最適な出発点です。この記事では、Laravel で HTTP リクエストを受信してからレスポンスが返されるまでに何が起こるかを紹介します。リクエストのライフサイクルを詳しく調べると、Laravel の構造を理解するのに役立ちます。 (Laravel 8 ベース)
リクエストのライフサイクルには、オートローダー、カーネル、サービスプロバイダー、ディスパッチリクエストとルーティングなど、さまざまな用語があります。すべての用語を詳細に理解すると、フレームワークへの理解が深まり、必要に応じてさまざまな機能を使用してフレームワークを拡張できます。
プロジェクトの依存関係を読み込み、Laravel アプリケーション インスタンスを作成します
Laravel アプリケーションへのすべてのリクエストのエントリ ポイントは、public/index.php
ファイルです。すべてのリクエストは、Web サーバー (Apache/Nginx) 構成によってこのファイルに送信されます。そのindex.phpファイルには多くのコードは含まれていません。代わりに、これはフレームの残りの部分をロードするための開始点になります。
# 1、加载项目依赖require __DIR__.'/../vendor/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php';
index.php
ファイルは、Composer によって生成されたオートローダー定義をロードし、bootstrap/app.php
から Laravel アプリケーションのインスタンスを取得します。
bootstrap/app.php:
<?php # 2、创建应用实例 $app = new Illuminate\Foundation\Application( $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__) ); # 3、完成内核绑定 $app->singleton( Illuminate\Contracts\Http\Kernel::class, App\Http\Kernel::class ); $app->singleton( Illuminate\Contracts\Console\Kernel::class, App\Console\Kernel::class ); $app->singleton( Illuminate\Contracts\Debug\ExceptionHandler::class, App\Exceptions\Handler::class ); return $app;
その後、Laravel フレームワークをブートストラップして、アプリケーション インスタンスを使用および生成します。
public/index.php:
# 4、接收请求并响应$kernel = $app->make(Kernel::class);// 处理请求$response = tap($kernel->handle( // 创建请求实例 $request = Request::capture()// 发送响应))->send();$kernel->terminate($request, $response);
アプリケーション インスタンスが生成されると、受信リクエストはカーネルによって処理されます。
次に、アプリケーションに入るリクエストのタイプに応じて、受信リクエストが HTTP コアまたはコンソール コアに送信されます。これら 2 つのコアは、すべてのリクエストが流れる中心的な場所として機能します。ここでは、app/Http/Kernel.php
にある HTTP カーネルに注目してみましょう。
HTTP カーネルは、リクエストを実行する前に実行されるブートストラップの配列を定義する Illuminate\Foundation\Http\kernel
クラスを拡張します。これらのブートストラップは、例外処理の構成、ロギングの構成、アプリケーション環境の検出、およびリクエストが実際に処理される前に完了する必要があるその他のタスクの実行に使用されます。通常、これらの構成について心配する必要はありません。
HTTP カーネルは、アプリケーションによって処理される前にすべてのリクエストが通過する必要がある HTTP ミドルウェアのリストも定義します。これらのミドルウェアは、HTTP セッションの読み取りと書き込み、アプリケーションがメンテナンス モードであるかどうかの判断、CSRF トークンの検証などを処理します。これについては次に詳しく説明します。
HTTP カーネルのハンドル メソッドのシグネチャは非常に単純です。リクエスト インターフェイスを受け取り、レスポンス インターフェイスを返します。カーネルは、アプリケーション全体を表す大きなブラック ボックスであると考えてください。 HTTP リクエストを与えると、HTTP レスポンスが返されます。
HTTP カーネルは、ミドルウェアやその他の機能を構成することによってサービス プロバイダーも読み込みます。
最も重要なカーネル ブート操作の 1 つは、アプリケーションの サービス プロバイダー
をロードすることです。アプリケーションのすべてのサービス プロバイダーは、config/app.php
の providers
配列内にあります。
Laravel は、このプロバイダーのリストを反復処理し、それぞれのプロバイダーをインスタンス化します。プロバイダーがインスタンス化された後、すべてのプロバイダーで register
メソッドが呼び出されます。次に、すべてのプロバイダーが登録されると、各プロバイダーで boot
メソッドが呼び出されます。
サービス プロバイダーは、データベース、キュー、検証、ルーティング コンポーネントなど、フレームワークのさまざまなコンポーネントをすべてブートストラップする責任があります。基本的に、Laravel によって提供される主要な機能はすべて、サービスプロバイダーによってブートストラップされ、設定されます。サービスプロバイダーは、ブートストラップおよび構成フレームワークによって提供される多くの機能により、Laravel ブートストラッププロセス全体の最も重要な部分です。
サービス プロバイダーの boot
メソッドを呼び出す前に、なぜ各サービス プロバイダーの register メソッドが呼び出されるのか疑問に思われるかもしれません。答えは簡単です。最初に各サービス プロバイダーの register メソッドを呼び出すことにより、サービス プロバイダーは、ブート メソッドの実行時に登録され、使用できる各コンテナー バインディングに依存できます。
サービスプロバイダーは、Laravel アプリケーションをブートストラップするための鍵です。アプリケーション インスタンスが作成され、サービス プロバイダーが登録され、リクエストがブートストラップ アプリケーションに渡されます。本当に簡単です!
Laravel アプリケーションがどのように構築され、サービスプロバイダーを通じてブートストラップされるかをしっかりと把握することは、非常に価値があります。アプリケーションのデフォルトのサービスプロバイダーは、app/Providers
ディレクトリに保存されます。
デフォルトでは、AppServiceProvider は空です。この手順は、アプリケーション独自のブートストラップとサービス コンテナー バインディングを追加するのに適しています。大規模なアプリケーションの場合、複数のサービス プロバイダーを作成し、それぞれのサービス プロバイダーが、アプリケーションが使用する特定のサービスに対してより詳細なガイダンスを提供することができます。
アプリケーションがブートストラップされ、すべてのサービス プロバイダーが登録およびブートストラップされると、リクエストはディスパッチのためにルーターに渡されます。
アプリケーションで最も重要なサービス プロバイダーの 1 つは、App\Providers\RouteServiceProvider
です。このサービス プロバイダーは、アプリケーションの routes
ディレクトリに含まれるルート ファイルを読み込みます。
ルーターはリクエストをルートまたはコントローラーに送信し、ルート固有のミドルウェアを実行します。
ミドルウェアは、アプリケーションに入る HTTP リクエストをフィルタリングまたは検査するための便利なメカニズムを提供します。たとえば、Laravel には、アプリケーションのユーザーが認証されていることを確認するミドルウェアが含まれています。ユーザーが認証されていない場合、ミドルウェアはユーザーをログイン ページにリダイレクトします。ただし、ユーザーが認証されている場合、ミドルウェアはアプリケーションへのリクエストをさらに許可します。ミドルウェアの中には、HTTP コアの $middleware
属性で定義されているものなど、アプリケーション内のすべてのルートに割り当てられるものもありますが、特定のルートまたはルートのグループにのみ割り当てられるものもあります。ミドルウェアの完全なドキュメントを読むことで、ミドルウェアの詳細を学ぶことができます。
リクエストが一致するすべてのルート割り当てミドルウェアを通過する場合は、HTTP リクエストをコントローラーに送信するか、コントローラーを省略してビューまたは応答を直接返します。
コントローラー app/Http/Controllers/
特定のアクションを実行し、データをビューに送信します。
Views resources/views/
データを適切にフォーマットして、HTTP 応答を提供します。
ルートまたはコントローラーのメソッドが応答を返すと、その応答はルートのミドルウェアを通じて返され、アプリケーションは送信される応答を変更または検査する機会が得られます。
通常、ルーティング操作から単純な文字列や配列を返すことはありません。代わりに、完全な Illuminate\Http\Response
インスタンスまたはビューが返されます。
Response インスタンスは、HTTP レスポンスを構築するための多くのメソッドを提供する Symfony\Component\Http\Foundation\Response
クラスから派生します。
最後に、応答がミドルウェアを介して返されると、HTTP カーネルのハンドル メソッドは応答オブジェクトを返し、index.php
ファイルは返された応答に対して send メソッドを呼び出します。 send メソッドは、応答コンテンツをユーザーの Web ブラウザに送信します。
この時点で、Laravel リクエストのライフサイクル全体のすべてのステップが完了しました。
[関連する推奨事項: laravel ビデオチュートリアル ]
以上が詳細な説明と事例: Laravel リクエストのライフサイクルの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。