🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Laravel 是单入口文件的mvc重型框架,里面集成了消息队列,orm,ioc等功能模块。laravel的生命周期简述如下: 1、从`public\index.php`,进入框架; 2、注册加载composer自动生成的`class loader`,初始化第三方依赖; 3、生成容器(bootstrap/app.php),注册核心组件(Kernel::class); 4、处理请求,生成并返回响应; 5、结束请求,进行回调 从`public\index.php`开始。 注册加载composer自动生成的`class loader`,初始化第三方依赖,laravel本身实现的也已经高度组件化了。 使用上一步生成的容器`Container`类,从`bootstrap/app.php`脚本获取 Laravel 应用实例,注册laravel核心组件。 如果是web请求不是命令行请求,那么**创建 Laravel HTTP Kernel 核心**,请求被发送到`HTTP`内核。 HTTP 内核继承自 Illuminate\\Foundation\\Http\\Kernel 类,这个类中拥有三个核心成员变量 $app,$router,$bootstrappers。 ~~~ protected $app; protected $router; protected $bootstrappers \= \[ \\Illuminate\\Foundation\\Bootstrap\\LoadEnvironmentVariables::class, # 加载 .env 中的配置信息 \\Illuminate\\Foundation\\Bootstrap\\LoadConfiguration::class, # 加载 config 目录中所有配置文件的配置信息 \\Illuminate\\Foundation\\Bootstrap\\HandleExceptions::class, # 异常处理 \\Illuminate\\Foundation\\Bootstrap\\RegisterFacades::class, # 注册门面 \\Illuminate\\Foundation\\Bootstrap\\RegisterProviders::class, # 注册Service Providers \\Illuminate\\Foundation\\Bootstrap\\BootProviders::class, # 注册启动器 \]; ~~~ $app 咱们已经说了足够多,就是应用容器,我们所有的工作都在这个容器中进行。 $router 路由对象,它提供路由相关的服务,帮助我们把网络请求分配给对应的路由进行逻辑处理,然后把处理的结果(网络响应)返回给我们,我们在web.php中定义的路由就是由它来管理的。 $bootstrappers 数组,这个数组中的任务项在网络请求被处理前运行,我们可以看到**环境检查,配置加载,异常处理,Facedes 门面注册,ServiceProvider 注册**等等任务都需要在网络请求被处理前被首先执行,而且这些任务是有前后顺序的,排在前面的会首先执行,这也很容易理解,因为不管是 Facades 还是 Service Providers 都是定义在 config 目录中的 app.php 文件中的,只有加载来配置之后才能注册门面和Service Providers。 结束请求,进行回调,终止 Laravel 应用,Laravel 到此也完成了它的历史使命。中间件中有一类的中间件,terminable middleware 的处理逻辑就是在这个阶段执行的。 **扩展知识【中间件】** Middleware ,在 Kernel 以及它的基类 Illuminate\\Foundation\\Http\\Kernel 中定义了一系列的 middlewares ,借助这些中间件,就可以完成对用户请求的过滤和安全检查等等功能。 ~~~ public function __construct(Application $app, Router $router) { $this->app = $app; $this->router = $router; $route->middlewarePriority = $this->middlewarePriority; foreach ($this->middlewareGroups as $key => $middleware) { $router->middlewareGroup($key, $middleware); } foreach ($this->routeMiddleware as $key => $middleware) { $router->aliasMiddleware($key, $middleware); } } ~~~ 中间件的作用:所有请求在处理前需要经过的 HTTP[中间件](https://laravel.com/docs/5.4/middleware),这些中间件处理[HTTP 会话](https://laravel.com/docs/5.4/session)的读写、判断应用是否处于维护模式、验证[CSRF 令牌](https://laravel.com/docs/5.4/csrf)等等。 ![](https://img.kancloud.cn/1d/1e/1d1e54555ca319d5aaee750cec85661f_572x508.png) **laravel请求生命周期流程图,如下** ![](https://img.kancloud.cn/92/26/922612cbdd637e1d8f8210b16558b445_1748x696.png)