天天看点

Laravel核心解读--HTTP内核

http kernel

http kernel是laravel中用来串联框架的各个核心组件来网络请求的,简单的说只要是通过​<code>​public/index.php​</code>​来启动框架的都会用到http kernel,而另外的类似通过​<code>​artisan​</code>​命令、计划任务、队列启动框架进行处理的都会用到console kernel, 今天我们先梳理一下http kernel做的事情。

​​laravel核心解读--contracts契约​​

既然http kernel是laravel中用来串联框架的各个部分处理网络请求的,我们来看一下内核是怎么加载到laravel中应用实例中来的,在​<code>​public/index.php​</code>​中我们就会看见首先就会通过​<code>​bootstrap/app.php​</code>​这个脚手架文件来初始化应用程序:

下面是 ​<code>​bootstrap/app.php​</code>​ 的代码,包含两个主要部分创建应用实例和绑定内核至 app 服务容器

http 内核继承自 illuminatefoundationhttpkernel类,在 http 内核中 内它定义了中间件相关数组, 中间件提供了一种方便的机制来过滤进入应用的 http 请求和加工流出应用的http响应。

在其父类 「illuminatefoundationhttpkernel」 内部定义了属性名为 「bootstrappers」 的 引导程序 数组:

引导程序组中 包括完成环境检测、配置加载、异常处理、facades 注册、服务提供者注册、启动服务这六个引导程序。

有关中间件和引导程序相关内容的讲解可以浏览我们之前相关章节的内容。

在将应用初始化阶段将http内核绑定至应用的服务容器后,紧接着在​<code>​public/index.php​</code>​中我们可以看到使用了服务容器的​<code>​make​</code>​方法将http内核实例解析了出来:

在实例化内核时,将在 http 内核中定义的中间件注册到了 ​​路由器​​,注册完后就可以在实际处理 http 请求前调用路由上应用的中间件实现过滤请求的目的:

通过服务解析完成http内核实例的创建后就可以用http内核实例来处理http请求了

在处理请求之前会先通过​<code>​illuminate\http\request​</code>​的 ​<code>​capture()​</code>​ 方法以进入应用的http请求的信息为基础创建出一个 laravel request请求实例,在后续应用剩余的生命周期中​<code>​request​</code>​请求实例就是对本次http请求的抽象,关于​​laravel request请求实例​​的讲解可以参考以前的章节。

将http请求抽象成​<code>​laravel request请求实例​</code>​后,请求实例会被传导进入到http内核的​<code>​handle​</code>​方法内部,请求的处理就是由​<code>​handle​</code>​方法来完成的。

​<code>​handle​</code>​ 方法接收一个请求对象,并最终生成一个响应对象。其实​<code>​handle​</code>​方法我们已经很熟悉了在讲解很多模块的时候都是以它为出发点逐步深入到模块的内部去讲解模块内的逻辑的,其中​<code>​sendrequestthroughrouter​</code>​方法在服务提供者和中间件都提到过,它会加载在内核中定义的引导程序来引导启动应用然后会将使用​<code>​pipeline​</code>​对象传输http请求对象流经框架中定义的http中间件们和路由中间件们来完成过滤请求最终将请求传递给处理程序(控制器方法或者路由中的闭包)由处理程序返回相应的响应。关于​<code>​handle​</code>​方法的注解我直接引用以前章节的讲解放在这里,具体更详细的分析具体是如何引导启动应用以及如何将传输流经各个中间件并到达处理程序的内容请查看​​服务提供器​​、​​中间件​​还有​​路由​​这三个章节。

经过上面的几个阶段后我们最终拿到了要返回的响应,接下来就是发送响应了。

发送响应由 ​<code>​illuminate\http\response​</code>​的​<code>​send()​</code>​方法完成父类其定义在父类​<code>​symfony\component\httpfoundation\response​</code>​中。

关于response对象的详细分析可以参看我们之前讲解laravel response对象的章节。

响应发送后,http内核会调用​<code>​terminable​</code>​中间件做一些后续的处理工作。比如,laravel 内置的「session」中间件会在响应发送到浏览器之后将会话数据写入存储器中。

http内核的​<code>​terminate​</code>​方法会调用​<code>​teminable​</code>​中间件的​<code>​terminate​</code>​方法,调用完成后从http请求进来到返回响应整个应用程序的生命周期就结束了。

本节介绍的http内核起到的主要是串联作用,其中设计到的初始化应用、引导应用、将http请求抽象成request对象、传递request对象通过中间件到达处理程序生成响应以及响应发送给客户端。这些东西在之前的章节里都有讲过,并没有什么新的东西,希望通过这篇文章能让大家把之前文章里讲到的每个点串成一条线,这样对laravel整体是怎么工作的会有更清晰的概念。

本文已经收录在系列文章laravel源码学习里,欢迎访问阅读。