ホームページ > 記事 > PHPフレームワーク > Laravelのライフサイクルを詳しく解説
以下は、#Laravel のチュートリアルコラムで、Laravel のライフサイクルを紹介します。
Laravel のライフサイクル
世の中のすべてのものにはライフサイクルがあり、それを理解する必要があります。あらゆるツールを使用する 機能すれば使いやすくなります。これはアプリケーション開発にも当てはまります。原理を理解すれば、簡単に使用できるようになります。Laravel のライフサイクルを理解する前に、まず PHP のライフサイクルを確認しましょう。
PHP のライフサイクル
PHP の動作モード
PHP の 2 つの動作モードは WEB モードです、CLI モード。ライフ サイクル
php ファイルをリクエストすると、PHP はリクエストを完了するために 5 つの段階を経ます。スイッチング:
php.ini で指定された拡張初期化関数を呼び出して、
mysql などの初期化作業を実行します。 # ## 拡大。
変数など、このスクリプトの実行に必要な変数名と変数値の内容を使用してシンボル テーブルを初期化します。
メソッドを順番に呼び出し、unset
関数を呼び出します。 unset $_SESSION
変数など、変数ごとに。
メソッドを呼び出します。これは、各モジュールがメモリを解放する最後の機会です。これは、次のリクエストがないことを意味します。
5
が可能です。一度だけ実行され、次のリクエストが来たときに 2-4
のライフサイクルが繰り返されるため、システム モジュールの初期化によって生じるオーバーヘッドが節約されます。
PHP ライフ サイクル
これらを理解すると、
Laravel コードを最適化し、Laravel の singleton
(シングル ケース) をより深く理解できるようになります。少なくとも、各リクエストの終了時に PHP の変数は unset
になり、Laravel の singleton
は特定のリクエスト中のみ singleton
になることがわかっています。 Laravel の静的変数は、各リクエストが最後に unset
になるため、複数のリクエスト間で共有することはできません。これらの概念を理解することは、高品質のコードを作成するための最初で最も重要なステップです。したがって、グローバルな効果を持つ Java 静的変数とは異なり、PHP はスクリプト言語であり、すべての変数はこのリクエストでのみ有効になり、次のリクエストでリセットされることに注意してください。
概要
Laravel のライフサイクルは
public\index.php から始まりますpublic\index.php
で始まり、終わります。
リクエスト プロセス
の完全なソース コードです。分割できます。 4 つのステップに分けます: <pre class="brush:php;toolbar:false;">1. require __DIR__.&#39;/../bootstrap/autoload.php&#39;;
2. $app = require_once __DIR__.&#39;/../bootstrap/app.php&#39;;
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
3. $response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
$response->send();
4. $kernel->terminate($request, $response);</pre>
以下は 4 つのステップの詳細な説明です:
依存関係が含まれます。
请求结束,进行回调(对应代码4,还记得可终止中间件吗?没错,就是在这里回调的)。
我们不妨在详细一点:
class loader
就是加载初始化第三方依赖。
Container
并向容器注册核心组件,是从 bootstrap/app.php
脚本获取 Laravel 应用实例,
请求被发送到 HTTP
内核或 Console
内核,这取决于进入应用的请求类型。
取决于是通过浏览器请求还是通过控制台请求。这里我们主要是通过浏览器请求。
HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类,该类定义了一个 bootstrappers 数组,这个数组中的类在请求被执行前运行,这些 bootstrappers 配置了错误处理、日志、检测应用环境以及其它在请求被处理前需要执行的任务。
protected $bootstrappers = [ //注册系统环境配置 (.env) 'Illuminate\Foundation\Bootstrap\DetectEnvironment', //注册系统配置(config) 'Illuminate\Foundation\Bootstrap\LoadConfiguration', //注册日志配置 'Illuminate\Foundation\Bootstrap\ConfigureLogging', //注册异常处理 'Illuminate\Foundation\Bootstrap\HandleExceptions', //注册服务容器的门面,Facade 是个提供从容器访问对象的类。 'Illuminate\Foundation\Bootstrap\RegisterFacades', //注册服务提供者 'Illuminate\Foundation\Bootstrap\RegisterProviders', //注册服务提供者 `boot` 'Illuminate\Foundation\Bootstrap\BootProviders', ];
注意顺序:
Facades
先于ServiceProviders
,Facades
也是重点,后面说,这里简单提一下,注册Facades
就是注册config\app.php
中的aliases
数组,你使用的很多类,如Auth
,Cache
,DB
等等都是Facades
;而ServiceProviders
的register
方法永远先于boot
方法执行,以免产生boot
方法依赖某个实例而该实例还未注册的现象。
HTTP 内核还定义了一系列所有请求在处理前需要经过的 HTTP 中间件,这些中间件处理 HTTP 会话的读写、判断应用是否处于维护模式、验证 CSRF 令牌等等。
HTTP 内核的标志性方法 handle处理的逻辑相当简单:获取一个
Request
,返回一个Response
,把该内核想象作一个代表整个应用的大黑盒子,输入 HTTP 请求,返回 HTTP 响应。
在Laravel基础的服务启动之后,就要把请求传递给路由了。路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。
传递给路由是通过 Pipeline
(管道)来传递的,但是Pipeline有一堵墙,在传递给路由之前所有请求都要经过,这堵墙定义在app\Http\Kernel.php
中的$middleware
数组中,没错就是中间件,默认只有一个CheckForMaintenanceMode
中间件,用来检测你的网站是否暂时关闭。这是一个全局中间件,所有请求都要经过,你也可以添加自己的全局中间件。
然后遍历所有注册的路由,找到最先符合的第一个路由,经过它的路由中间件,进入到控制器或者闭包函数,执行你的具体逻辑代码。
所以,当请求到达你写的代码之前,Laravel已经做了大量工作,请求也经过了千难万险,那些不符合或者恶意的的请求已被Laravel隔离在外。
以上がLaravelのライフサイクルを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。