3

Laravel 请求周期

加载 composer 自动加载器

require __DIR__.'/../bootstrap/autoload.php';

获取 Application 应用对象 Laravel 实例化应用解析

// 此 $app 对象贯穿全文
$app = require_once __DIR__.'/../bootstrap/app.php';

主要过程:
    1. 设置基础路径
    2. 基础绑定
    3. 注册全局基础服务
    4. 核心容器别名设置
    5. 注册三个单例

获取 Kernel 对象 Laravel kernel实例化

// 此 $kernel 对象为 Laravel 应用的枢纽,将会协调各部分之间的工作,完成请求
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

主要过程:
    1. 注入应用对象
    2. 注入事件对象
    3. 注入路由集合对象
    4. 注入路由对象
    5. 将各中间件注入到路由对象

获取 Request 对象

$request = Illuminate\Http\Request::capture()

主要过程:
    1. 委托\Symfony\Component\HttpFoundation\Request组件,并注入全局变量(封装成相应的对象),创建基础请求对象
    2. 通过基础请求对象创建 $request

处理 Request 对象,返回 Response 对象 Laravel Kernel实例化后的处理 Laravel Kernel引导流程分析 Laravel 中间件 Laravel 路由处理 Laravel 响应准备 Laravel 路由执行

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

主要过程:  
    1. 注入请求对象($request)
    2. 根据配置项设置应用的运行环境(包括加载设置系统环境变量、加载配置文件、设置系统错误异常、设置 Facade、注册配置项的服务提供者、启动服务提供者的引导项)并触发相应的事件
    3. 处理全局中间件
    4. 路由解析(请求分发、路由查找、路由匹配、路由分离器设置、事件分发、路由执行)
    5. 通过路由解析返回的 content 创建 $response 对象
    6. 设置 $response 对象的响应头

发送响应

$response->send();

执行后续操作

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

主要过程:
    1. 获取中间件,并尝试触发每个中间件的 terminate 方法
    2. 触发 terminate 的事件

TylerZou
70 声望20 粉丝

I have a dream!