Laravel进阶系列笔记--(一)Laravel生命周期
作者:温新
时间:2021-07-04
hi,我是温新,一名PHPer。
了解完基础系列后,那么有必要来提高一个自己。Laravel太庞大了,基础系列仅仅只是它的一点点。Laravel进阶系列中的内容有许多我是没有用到也没有机会用到,不管用不用的到,那么现在一起重新学习吧。
序言
了解完基础系列后,是否有这样的疑问,Laravel的生命周期是怎么样的?中间件是如何拦截用户请求的?这都将在进阶系列中可以找到答案。
现在来安装一个全新的Laravel项目开启进阶系列的学习吧。
Laravel生命周期剖析
PHP生命周期有五个阶段,而Laravel运行中PHP的第三个生命周期内。
提出PHP生命周期只是为了更好的了解Laravel生命周期,这里不必纠结。
一切从index.php开始
Laravel请求从public/index.php
开始,这也是Laravel生命周期的开始。先来看看index.php
的内容:
<?php
use Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\Request;
define('LARAVEL_START', microtime(true));
if (file_exists(__DIR__.'/../storage/framework/maintenance.php')) {
require __DIR__.'/../storage/framework/maintenance.php';
}
require __DIR__.'/../vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
$kernel = $app->make(Kernel::class);
$response = tap($kernel->handle(
$request = Request::capture()
))->send();
$kernel->terminate($request, $response);
第一步:1、请求开始
用户请求到达index.php
,会判断项目是否处于维护状态,若是处于维护状态,那么直接返回并终止请求向下走。
第二步:2、自动加载
这个过程会自动载项目所依赖的第三方组件包。
第三步:3、创建Laravel应用实例
app.php
会创建应用实例。在创建应用实例的过程中会完成注册项目基础服务
、注册服务提供者
、注册目录路径
等工作。
查看app.php
内容:
<?php
// 3.1、创建应用实例
$app = new Illuminate\Foundation\Application(
$_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
// 3.2、完成内核绑定
$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;
app.php
完成两个部分的工作,分别是创建应用实例
与绑定内核到APP服务容器
。
3.1、查看实例化应用实例类
创建应用实例时会去实例化Illuminate\Foundation\Application
类,在创建应用实例前会完成基础路径的注册
、基础服务提供者的注册
、注册核心容器别名`的注册工作并将其绑定到应用容器。
// Illuminate\Foundation\Application.php
public function __construct($basePath = null)
{
if ($basePath) {
$this->setBasePath($basePath);
}
$this->registerBaseBindings();
$this->registerBaseServiceProviders();
$this->registerCoreContainerAliases();
}
服务提供者在此阶段注册
3.2、内核绑定
Laravel根据请求类型的不同,将请求发送到HTTP内核或Console内核。不管是哪一个请求,其最终的作用都是接收一个HTTP请求,并返回一个响应结果。
HTTP内核继承自Illuminate\Foundation\Http\Kernel
,在这个类中定义了一个$bootstrappers
数组,这个数组中的类在请求被执行前运行。
HTTP内核还定义了中间件,所有请求都会经过HTTP中间件,Laravel拦截HTTP请求就是在这个地方进行拦截。
第四步:请求与响应
应用容器
注册完成后,进入请求接收与响应
阶段:
// 请求接收与响应
$kernel = $app->make(Kernel::class);
$response = tap($kernel->handle(
$request = Request::capture()
))->send();
当请求走到$kernel = $app->make(Kernel::class);
这时,看到它做了什么。
public function __construct(Application $app, Router $router)
{
$this->app = $app;
$this->router = $router;
$this->syncMiddlewareToRouter();
}
内核在实例化时,构造函数中将中间件组
注册到路由,注册完毕后就可以利用这些中间件对请求进行过滤。
4.1、处理HTTP请求
// 处理请求
$response = tap($kernel->handle(
// 创建请求实例
$request = Request::capture()
))->send();
一旦应用被启动且所有服务提供者被注册,Request
将会被交给路由进行分发,路由器将分发请求到路由或控制器,同时运行所有路由指定的中间件。