🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ### **1、简介** 当我们使用现实世界中的任何工具时,如果理解了该工具的工作[原理](http://laravelacademy.org/tags/%e5%8e%9f%e7%90%86 "View all posts in 原理"),那么用起来就会得心应手,应用开发也是如此。当你理解了开发工具如何工作,用起来就会更加游刃有余。 本[文档](http://laravelacademy.org/tags/%e6%96%87%e6%a1%a3 "View all posts in 文档")的目标就是从一个更好、更高层面向你阐述 [Laravel](http://laravelacademy.org/tags/laravel "View all posts in Laravel") 框架的工作原理。通过对框架更全面的了解,一切都不再那么神秘,你将会更加自信的构建应用。 如果你不能马上理解所有这些条款,不要失去信心!先试着掌握一些基本的东西,你的知识将会随着对本文档的探索而不断提高。 ### **2、[生命周期](http://laravelacademy.org/tags/%e7%94%9f%e5%91%bd%e5%91%a8%e6%9c%9f "View all posts in 生命周期")概览** #### **第一件事** Laravel 应用的所有[请求](http://laravelacademy.org/tags/%e8%af%b7%e6%b1%82 "View all posts in 请求")入口都是 `public/index.php` 文件,所有请求都会被web服务器(Apache/Nginx)导向这个文件。 `index.php` 文件包含的代码并不多,但是,这里是加载框架其它部分的起点。 `index.php` 文件载入 Composer 生成的自动加载设置,然后从 `bootstrap/app.php` 脚本获取 Laravel 应用实例,Laravel 的第一个动作就是创建服务容器实例。 #### **HTTP/Console 内核** 接下来,请求被发送到 HTTP 内核或 Console 内核,这取决于进入应用的请求类型。这两个内核是所有请求都要经过的中央处理器,现在,就让我们聚焦在位于 `app/Http/Kernel.php` 的 HTTP 内核。 HTTP 内核继承自 `Illuminate\Foundation\Http\Kernel` 类,该类定义了一个 `bootstrappers` 数组,这个数组中的类在请求被执行前运行,这些 `bootstrappers` 配置了错误处理、日志、检测应用环境以及其它在请求被处理前需要执行的任务。 HTTP 内核还定义了一系列所有请求在处理前需要经过的 HTTP 中间件,这些中间件处理 HTTP 会话的读写、判断应用是否处于维护模式、验证 CSRF 令牌等等。 HTTP 内核的标志性方法 `handle` 处理的逻辑相当简单:获取一个 Request,返回一个 Response,把该内核想象作一个代表整个应用的大黑盒子,输入 HTTP 请求,返回 HTTP 响应。 **[服务提供者](http://laravelacademy.org/tags/%e6%9c%8d%e5%8a%a1%e6%8f%90%e4%be%9b%e8%80%85 "View all posts in 服务提供者")** 内核[启动过程](http://laravelacademy.org/tags/%e5%90%af%e5%8a%a8%e8%bf%87%e7%a8%8b "View all posts in 启动过程")中最重要的动作之一就是为应用载入服务提供者,应用的所有服务提供者都被配置在 `config/app.php`配置文件的  `providers` 数组中。首先,所有提供者的 `register` 方法被调用,然后,所有提供者被注册之后,`boot` 方法被调用。 服务提供者负责启动框架的所有各种各样的组件,比如数据库、队列、验证器,以及路由组件等,正是因为他们启动并配置了框架提供的所有特性,服务提供者是整个 Laravel 启动过程中最重要的部分。 **分发请求** 一旦应用被启动并且所有的服务提供者被注册,Request 将会被交给路由器进行分发,路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。 ### **3、聚焦服务提供者** 服务提供者是启动 Laravel 应用中最关键的部分,应用实例被创建后,服务提供者被注册,请求被交给启动后的应用进行处理,整个过程就是这么简单! 对 Laravel 应用如何通过服务提供者构建和启动有一个牢固的掌握非常有价值,当然,应用默认的服务提供者存放在`app/Providers` 目录下。 默认情况下,`AppServiceProvider` 是空的,这里是添加自定义启动和服务容器绑定的最佳位置,当然,对大型应用,你可能希望创建多个服务提供者,每一个都有着更加细粒度的启动。