Laravel 源码学习笔记 1:请求生命周期简述
一个 php 请求的过程,简单来说,经过了
- 网络 (dns 寻址,网络那几层等等)
- 服务器 (nginx 接收,有负载均衡,分流另说)
- php (fpm 处理的话,给 worker 进程)
- 请求进入 laravel 项目,index 开始
前几个,以后有时间,会另外做学习分享,和大佬们一起讨论改进,这波主要是研究一下一个请求在 laravel 框架中的简单流程,后面的文章会针对其中的细节进行代码跟踪及举例验证等等。
- 首先通过 composer 自动加载类
- 实例化 app 容器对象,在构造方法里,注册绑定基础服务,比如事件,日志,异常等
- 注册绑定 http 的接口和核心实现类到 app 容器
- 捕获请求 request,将请求丢入 kernel 核心类的 handle 方法执行
- 在 handle 中首先把 request 注册到容器并清除之前 request 缓存
- 在 handle 中然后执行服务启动引导,引导 http kernel 类的参数 bootstraper,env 文件,config 配置,facede 别名,服务提供者注册,服务提供者引导启动
- 在 handle 中接着请求通过管道对象,管道任务有多个中间件,过滤
- 通过中间件后,根据路由分发到不同的控制器或者闭包执行,返回响应
- 发送响应,停止框架容器
在 index.php 文件中其实就是整个过程了
//创建app容器实例
$app = require_once __DIR__.'/../bootstrap/app.php';
//解析kernel http 核心类
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
//请求丢进kernel的handle解析,并返回结果
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
//发送响应
$response->send();
//调用中间件的terminate,容器的terminate,停止
$kernel->terminate($request, $response);
学习 laravel,不可避免要接触的概念就是容器,依赖注入,控制反转这些,已经有很多前辈很多好文章解释了,我简单说下个人的理解,举个栗子就是原先我们类 a 的方法中需要 new 类 b 的对象,控制权在 a,现在使用依赖注入,根据容器的绑定实现类,控制权就从 a 跑到容器集中处理了,也就是容器管理着类 b 和其对象的依赖,当类 a 需要 b 的对象实例时候,伸手向容器拿即可,不需要再 new 了。
laravel 处理请求,给我的感觉就是,整个过程就是在 容器的注册服务和业务的调用服务完成业务需求并返回处理结果的过程。
有什么不对或有疑问的地方请大佬们指正
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: