欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Laravel Reponse响应客户端示例详解

程序员文章站 2022-03-22 14:50:50
前言本篇文章逻辑较长,只说明和响应生命周期相关的必要代码。本文主要内容顺序为:1、执行上文管道中的then方法指定的闭包,路由的分发2、在路由器中(router类)找到请求($request 也就是经...

前言

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

本文主要内容顺序为:

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响应客户端内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!