前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >老王,Laravel的请求怎么一步步到达控制器的?

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

作者头像
写PHP的老王
发布2019-09-17 15:16:37
1.1K0
发布2019-09-17 15:16:37
举报
文章被收录于专栏:写PHP的老王写PHP的老王

老王啊,你能不能跟我解释一下,一个请求怎么一步步到达控制器的,中间都经历了哪些东西,以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']。当我们第二参数是一个字符串的时候则认为是控制器方法,将请求转发到控制器里去处理。否则执行回调函数处理。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写PHP的老王 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 老王啊,你能不能跟我解释一下,一个请求怎么一步步到达控制器的,中间都经历了哪些东西,以Laravel5.8为例。
  • 入口
  • Kernel中如何处理请求
  • 路由调度
  • 怎么找到路由的
  • 路由调度怎么处理请求
  • 怎么执行
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档