laravel的全生命周期
Laravel 的全生命周期(Lifecycle)指的是框架从接收到 HTTP 请求到返回响应的整个过程。它涵盖了 引导(Bootstrapping)、请求处理(Request Handling)、中间件(Middleware)、路由解析(Routing)、控制器执行(Controller Execution)、视图渲染(View Rendering) 等多个环节。
Laravel 生命周期详解#
1. 入口文件 (Public/index.php)#
Laravel 的生命周期从 public/index.php
文件开始,这个文件是 Laravel 应用的入口。它的主要作用:
- 加载 Composer 自动加载 (
require __DIR__.'/../vendor/autoload.php'
) - 创建 Laravel 应用实例 (
$app = require_once __DIR__.'/../bootstrap/app.php';
) - 执行内核(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 Kernel
和 Console 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 协议》,转载必须注明作者和本文链接
推荐文章: