前言

本篇文章逻辑较长,只说明和响应生命周期相关的必要代码。

本文主要内容顺序为:

1、执行上文管道中的then方法指定的闭包,路由的分发

2、在路由器中(router类)找到请求($request 也就是经过全局中间件处理的请求)匹配的路由规则

3、说明路由规则的加载(会跳转到框架的boot过程),注意这部分是在处理请求之前完成的,因为一旦当我们开始处理请求,就意味着所有的路由都应该已经加载好了,供我们的请求进行匹配

4、执行请求匹配到的路由逻辑

5、生成响应,并发送给客户端

6、最后生命周期的结束

7、基本响应类的使用

前文说道,如果一个请求顺利通过了全局中间件那么就会调用管道then方法中传入的闭包

查看illuminate\routing\router::dispatch方法

查看illuminate\routing\routecollection::match方法

下面说明框架如何加载的路由规则

application::boot方法

app\providers\routeserviceprovider::boot方法

illuminate\foundation\support\providers\routeserviceprovider::boot方法

app\providers\routeserviceprovider::map方法

router::__call方法

illuminate\routing\routeregistrar::__call方法

illuminate\routing\routeregistrar::group方法

router::group方法

illuminate\routing\routefileregistrar 文件

了解了理由加载流程,下面举个简单例子,laravel如何注册一个路由

routecollection的add方法

至此就生成了一条路由 注意我这里将注册api路由进行了注释,并且保证web.php中只有一条路由规则

以上是路由的加载 这部分是在$this->bootstrap()方法中完成的,还远没有到达路由分发和匹配的阶段,希望大家能够理解,至此路由规则生成完毕 保存到了routecollection实例中,每个路由规则都是一个route对象,供请求进行匹配

下面根据此条路由进行匹配,并执行返回结果

我们回到illuminate\routing\routecollection::match方法

router文件

route::run方法 注意此方法的返回值是直接从匹配的控制器或者闭包中返回的

illuminate\routing\controllerdispatcher::dispatch方法

控制器方法返回的结果到router::runroutewithinstack方法

首先我们来看直接生成laravel响应 illuminate\http\response

继承了symfony\component\httpfoundation\response

拿到响应后执行return $response->prepare($request);

拿到准备好的响应了,逐级向调用栈行层返回,关系如下

我们来看send方法 symfony\component\httpfoundation\response::send

$kernel->terminate($request, $response);

illuminate\foundation\http\kernel::terminate方法

laravel将控制器(闭包)返回的数据封装成response对象

观察上面的代码发现:

1 上面代码的作用是将路由节点返回的数据封装成response对象等待发送

2 并且上面的代码存在大量的instanceof判断 (为什么要这样呢 是因为一旦我们从控制器中返回一个实现了

laravel指定接口的实例,laravel就知道该如何渲染这些响应给客户端 此时你可能还不清楚,请看下面的例子)

3 而且没有else分支(这是因为laravel允许我们直接返回reponse对象,当我们直接返回resposne实例的时候会直接走到方法的最后一句话)

4 并且最终都调用的都是symfony response的prepare方法

我们先来看responsable接口 在laravel中任何一个实现了此接口的对象 都可以响应给客户端

看toresponse代码 我们发现 只要我们想办法返回符合laravel规定的数据,最终都会被转换成laravel response实例 比如我们可以返回responsable实例,arrayable实例,jsonable实例等等,大家可以尝试直接返回return new response(),response::create等等

route::get(‘rawreponse’, function () {

​ return new response(range(1,10));

});

更多请查看这位

通过十篇水文,分享了从类的自动加载,到走完laravel的生命周期。

第一次写博客不足太多,不爱看大量代码的道友,可以查看这位,其代码较少,但逻辑清晰明了。发现错误,欢迎指导,感谢!!!

总结

到此这篇关于laravel reponse响应客户端的文章就介绍到这了,更多相关laravel reponse响应客户端内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!