laravel的全生命周期

Laravel 的全生命周期(Lifecycle)指的是框架从接收到 HTTP 请求到返回响应的整个过程。它涵盖了 引导(Bootstrapping)、请求处理(Request Handling)、中间件(Middleware)、路由解析(Routing)、控制器执行(Controller Execution)、视图渲染(View Rendering) 等多个环节。


Laravel 生命周期详解#

1. 入口文件 (Public/index.php)#

Laravel 的生命周期从 public/index.php 文件开始,这个文件是 Laravel 应用的入口。它的主要作用:

  1. 加载 Composer 自动加载 (require __DIR__.'/../vendor/autoload.php')
  2. 创建 Laravel 应用实例 ($app = require_once __DIR__.'/../bootstrap/app.php';)
  3. 执行内核(Kernel),处理 HTTP 请求
require __DIR__.'/../vendor/autoload.php';

$app = require_once __DIR__.'/../bootstrap/app.php';

$kernel = $app->make(Kernel::class);
$response = $kernel->handle(
    $request = Request::capture()
);

$response->send();
$kernel->terminate($request, $response);

2. 创建应用实例#

bootstrap/app.php 文件中,Laravel 创建了一个 服务容器(Service Container),并绑定了 HTTP KernelConsole Kernel

$app = new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
  • Application 类是 Laravel 框架的核心,负责管理 服务容器、服务提供者、核心绑定 等。
  • Kernel 主要负责 中间件加载、请求调度
  • Service Providers 负责注册和初始化各种服务(如数据库、缓存、队列等)。

3. HTTP Kernel 处理请求#

app/Http/Kernel.php 中,handle() 方法负责处理请求:

class Kernel extends HttpKernel
{
    protected $middleware = [ /* 全局中间件 */ ];
    protected $middlewareGroups = [ /* 中间件组 */ ];
    protected $routeMiddleware = [ /* 路由中间件 */ ];
}

(1) 加载全局中间件#

Laravel 先加载 全局中间件

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \Illuminate\Foundation\Http\Middleware\TrimStrings::class,
];

(2) 加载路由中间件#

根据路由的定义,Laravel 还会加载 路由中间件

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

4. 服务提供者(Service Providers)注册#

config/app.php 文件中,Laravel 加载所有的服务提供者(Providers):

'providers' => [
    Illuminate\Auth\AuthServiceProvider::class,
    Illuminate\Broadcasting\BroadcastServiceProvider::class,
    Illuminate\Bus\BusServiceProvider::class,
    App\Providers\AppServiceProvider::class,
    App\Providers\AuthServiceProvider::class,
],

服务提供者的作用

  • 注册服务(如数据库连接、日志、事件、队列)。
  • 绑定依赖到 服务容器

5. 路由解析#

请求经过中间件后,Laravel 解析 路由(Route)

Route::get('/user/{id}', [UserController::class, 'show']);
  • Laravel 检查缓存(如果开启 php artisan route:cache
  • 解析 路由参数
  • 执行 控制器方法闭包函数
  • 如果路由不存在,返回 404 响应

6. 控制器执行#

如果匹配到一个控制器:

class UserController extends Controller
{
    public function show($id)
    {
        return User::find($id);
    }
}
  • 控制器构造函数__construct)执行
  • 方法执行show($id)
  • 模型调用User::find($id)

7. 视图渲染#

如果控制器返回 view(),Laravel 解析 Blade 模板:

return view('user.profile', ['user' => $user]);

Blade 视图存储在 resources/views 目录下:

<h1>{{ $user->name }}</h1>
  • Laravel 先 检查缓存
  • 编译 Blade 语法
  • 生成 HTML 响应

8. 发送 HTTP 响应#

控制器返回的内容最终转换为 Response 并发送:

$response = response()->json(['name' => 'Huanghualiang']);
$response->send();
  • JSON 格式化
  • HTTP 头信息处理
  • 发送到浏览器

9. 终止(Terminate)#

index.php 里,$kernel->terminate($request, $response); 会执行:

  • terminate() 方法
  • 关闭数据库连接
  • 执行 终止中间件(如日志、性能分析)

完整流程总结#

1️⃣ 入口 (index.php)

  • 载入 autoload.php
  • 创建 Application 实例
  • 绑定 Kernel(内核)

2️⃣ Kernel 处理请求

  • 加载 全局中间件
  • 解析 服务提供者
  • 解析 路由

3️⃣ 执行控制器

  • 解析参数
  • 调用 Controller 方法

4️⃣ 视图渲染

  • 解析 Blade 语法
  • 生成 HTML 响应

5️⃣ 返回 HTTP 响应

  • 发送 JSON 或 HTML

6️⃣ 请求终止

  • 关闭数据库连接
  • 执行 terminate() 方法

总结#

Laravel 全生命周期可以拆解为:

  • 启动阶段:加载 autoload.php、创建 Application 实例
  • 中间件阶段:处理全局中间件
  • 路由解析:匹配路由 & 解析控制器
  • 业务逻辑:执行控制器 & 调用数据库
  • 视图渲染:解析 Blade 模板
  • 返回响应:发送 JSON/HTML
  • 终止阶段:释放资源、记录日志

这样,Laravel 能够优雅地管理请求,从而实现高效的 Web 应用开发。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。