专栏首页写PHP的老王老王,Laravel的请求怎么一步步到达控制器的?

老王,Laravel的请求怎么一步步到达控制器的?

老王啊,你能不能跟我解释一下,一个请求怎么一步步到达控制器的,中间都经历了哪些东西,以Laravel5.8为例。

入口

Laravel5.8 入口文件为public/index.php

创建了一个Kernel对象,调用handler处理请求,获取返回结果。将返回结果输出到客户端,处理terminate操作。

Kernel中如何处理请求

容器里绑定的是App\Http\Kernel,继承于Illuminate\Foundation\Http\Kernel。

Kernel中调用sendRequestThroughRouter方法,将请求传递到路由处理当中。

在sendRequestThroughRouter当中,在app中绑定了request实例,并解绑掉其他request实例对象。这样在程序其他地方都能通过app()->make('request')获取到request实例对象。

调用bootstrap方法,加载引导类。

创建一个Pipeline对象,将路由调度与中间件放入调用链当中。所有request先经过全局的中间件,然后在通过路由分发。

因为Piepline调用链都是一个个的回调方法,所以在dispatchToRouter返回了一个匿名回调函数。使用Kernel的route属性进行调度。

Kernel的route是一个Illuminate\Routing\Router对象。

路由调度

从上面的方法可以看出,最终通过findRoute查找当前匹配的路由对象,并调用runRoute处理请求返回结果。

怎么找到路由的

对路由的匹配,是通过routes这个路由Collections去匹配的。

先通过请求的方法获取当前方法下可用的路由集合,在从这些集合中去遍历获取第一个匹配的路由。集合中每个item是一个Illuminate\Routing\Router对象。因此最终判断路由与请求是否匹配调用的是Illuminate\Routing\Router中的matches方法。

在Illuminate\Routing\Router提供了四个默认的验证器,当四个验证器通过的时候才会匹配成功。四个验证器分别是UriValidator验证访问路径,MethodValidator验证请求方法,SchemeValidator验证访问协议,HostValidator验证域名。其中对uri的验证内部是使用正则表达式验证。

路由调度怎么处理请求

路由对请求的处理也是返回一个Pipeline,先将请求通过中间件,然后在执行路由的run方法。在run方法里面判断当前是执行控制器方法还是回调方法,根据不同类型分开执行。

怎么执行

通过当前路由的action配置判断是否是控制器或者回调方法。从代码中可以看到,其实就是我们路由配置中的第二个参数对应到action['user']。当我们第二参数是一个字符串的时候则认为是控制器方法,将请求转发到控制器里去处理。否则执行回调函数处理。

到这里,我们的请求就真的到达了我们的控制器的方法中,开始执行我们写的代码了。

本文分享自微信公众号 - 写PHP的老王(laowang_php),作者:写PHP的老王

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何高效的从数组数据生成树状层级数组?

    任何无限极分类都会涉及到创建一个树状层级数组。从顶级分类递归查找子分类,最终构建一个树状数组。如果分类数据是一个数组配置文件,且子类父类id没有明确的大小关系。...

    写PHP的老王
  • 你对this的理解正确吗?有趣又神奇的this对象

    在每个面向对象编程语言中都会涉及到一个指向当前对象的值,this( 当然,python不是的)。但是this本身在很多时候都是有"歧义"的,因为不同的理解容易造...

    写PHP的老王
  • Laravel 路由匹配的过程都做了些什么呢?

    Laravel 的路由配置有很多,可以设置域名,设置请求协议,设置请求方式,请求路径。那么,Laravel在获取到请求之后,去匹配路由都做了些什么呢?

    写PHP的老王
  • asp.net

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    sofu456
  • 网络运维之windows静态路由配置

    网络工程师在多数情况下,都远使用程协助的方式为客户配置大/小型局域网中的交换机、路由等设备。

    椰果笔记
  • element导航问题总结

    官方文档 router-link-active----激活 class 类名 router-link-exact-active----精确激活的默认的 cl...

    RtyXmd
  • 更智能化的CDN技术,CDN迈向3.0时代

    我们的生活无时不刻不依赖着网络,伴随着终日对网速慢的抱怨和诅咒,同时也享受着网络技术发展带来的红利。怀着对技术细节刨根问底的执着,我们会发现原来身边还存在着像C...

    SDNLAB
  • Android性能优化典范(1)

    2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App。课程...

    WeTest质量开放平台团队
  • 图论-网络流

    温安适
  • JVM性能调优-探索堆内存到底是怎么分配

    新⽣代 GC (Minor GC):指发⽣在新⽣代的垃圾收集动作,因为 Java 对象⼤多都具备朝⽣夕灭的特性,所以 Minor GC ⾮常频繁,⼀般回收速度⽼...

    cwl_java

扫码关注云+社区

领取腾讯云代金券