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 协议》,转载必须注明作者和本文链接