生命周期
每个 laravel 请求(无论网络请求 or 命令行请求), 都将迅速被转换成 Illuminate Request 对象, 该对象经过多层最终由应用程序本身解析. 然后生成一个 Illuminate Response 对象, 该对象穿过多层,最终返回给用户.
生命周期简图
{ Middleware }Resuest --> { [ APP ] } --> Response{ }
引导app
larave 的入口文件是 public/index.php .
入口文件做了,以下三件事.
- 首先, 加载 Composer 的自动加载文件. 即包含了composer的所有依赖关系.
- 接着, 它启动
laravel的引导, 创建一个 app 容器(见 11章), 注册一些核心服务(包括 kernel等). - 最后, 它创建
kernel实例, 创建一个请求,代表当前用户的web请求, 并将请求传递给内核处理. 内核以Illuminate Response对象作为响应, index.php返回给最终用户. 然后, 内核终止页面请求.
Laravel’s 内核(kernel)
kernel 是每个 Laravel 应用程序的核心路由器, 负责接收用户请求, 通过中间对其进行处理, 捕获异常并将其传递给页面路由器, 然后返回最终响应.
其实有两个核心(kernel), 一个处理 web 请求 (the HTTP kernel) ; 另一个处理 console,cron, 和 Artisan 请求(the console kernel). 它们都有一个 handle() 方法, 负责获取 Request 对象, 并返回 Response 对象.
核心运行前,要先运行引导程序, 包括确定当前的运行环境( staging, local, production, etc ), 和运行所有服务提供者. HTTP kernel 还要明确包裹每个请求的中间件, 包含负责 session 和 CSRF 保护的中间件.
服务提供者
尽管这些引导程序中包含一些程序代码,但几乎所有Laravel的引导程序代码都被分离为一些被称为服务提供者的东西。一个服务提供者是一个类,封装了应用程序的各个部分运行实现其核心功能的逻辑。
服务提供者的概念可能有点难以理解,因此请先这样理解: 当应用初始化时,应用程序的很多组件都有一些引导代码需要运行. 服务提供者是一种将引导代码按相关类分组的工具. 如果为了使应用程序正常工作, 您需要运行任何代码,那么强烈建议你使用服务提供者.
例如,如果您发现正在使用的功能需要在容器(见 11章)中注册某些类,则可以为该功能创建服务提供者.
服务提供者的boot(), register(), and deferring
服务提供者有两个重要的方法: boot(), register(). 5.8 版本之后还有一个 DeferrableProvider 接口. (5.7之前是 $defer 属性).
工作原理:
- 首先,
register()方法被调用, 这是绑定类和别名到容器中的地方, 不要做任何依赖于整个应用程序被引导的事情. - 第二,
boot()方法被调用, 您现在可以在这里做任何其他的引导,例如绑定事件侦听器或定义路由等—-任何依赖于整个应用程序已经被引导的事情.
如果您的服务提供商只打算在容器中注册绑定(即,告诉容器如何解析给定的类或接口),但不执行任何其他引导,您可以“延迟”其注册,这意味着除非他们中的一个明确被容器请求, 否则它们将不会运行. 这样可以加快应用程序的平均启动时间。
如果你想延迟服务提供者的注册, 5.8+ 版本, 实现 Illuminate\Contracts\Support\DeferrableProvider 接口, 5.7 protected $defer 属性设置为 true. 然后,所有版本,都要增加一个 provides() 方法, 返回提供者提供的绑定列表.
例如:
...use Illuminate\Contracts\Support\DeferrableProvider;class GitHubServiceProvider extends ServiceProvider implements DeferrableProvider{public function provides(){return [GitHubClient::class,];}
