TP5路由分发原理简介

1、thinkphp5中一个典型的URL请求的执行过程大致如下:


用户请求 -> 路由解析 -> 调度请求 -> 执行操作 -> 响应输出


2、路由在框架中的作用打个比方的话,路由好比是WEB应用的总调度室,对于访问的URL地址,路由可以拒绝或者接受某个URL请求,并进行分发调度,而且还有一个副作用是因为路由规则可以随意定义,因此可以让你的URL请求地址更优雅,因为不会暴露实际的URL地址,也就意味着更安全,5.0的路由不仅仅只是支持路由到控制器的操作方法,甚至可以路由到任何的类或者闭包。


3、那么我们来分析下路由内部做了哪些事情,还是列举一个简单的例子


url请求过来会执行 App类里面的run方法,这个方法中tp5会去检测路由,也就是routeCheck方法,这个方法会去加载application应有目录下的route.php,这个文件其实就是我们自定义的一些路由规则 , 然后再通过tp内置的Route类库批量注册路由, 比如如果我们在route.php里面注册了这么一个路由信息'test' => 'index/index/test' (备注:比如我们访问xxx.com/test 实际上他是定位到xxx.com/index/index/test) 那么这些信息就会被Route基础类库注册到路由中,之后需要做的路由检测(根据路由定义返回不同的URL调度),这个时候需要分2种情况 ,第一种情况:检测后有值(备注:比如这种地址xxx.com/test的访问) 第二种情况:无内容、这说明当前的url请求不在自定义的路由配置中(比如最简单的xxx.com/index/index/index这个地址的访问),那么这个时候会执行Route::parseUrl这个解析,但是不管怎么样这两种情况的结果返回的都是如下格式:

Array

(

   [type] => module    #类型  tp5中有好几种 具体几个类型可以参考App类里面的exec方法

   [module] => Array

       (

           [0] => xxx  #模块

           [1] => xxx  #控制器

           [2] => xx   #方法

       )


)

4、接下来会根据上面返回的内容 来记录当前调度信息,然后会去执行app类里面的exec方法,我们已type=module来举例, 之后就会去执行App类里面的module(执行模块方法)、大致就这么回事


案例分析:

我们用一个URL请求案例来体验下路由的使用,定义一个控制器类命名为application/index/controller/Index.php:


namespace app\index\controller;


class Index

{

   public function test()

   {

       return 'hello-test' ;

   }

}

要访问Index控制器的test操作方法的话,没有定义路由规则之前,访问的URL地址应该是:


http://xxx.com/index/index/test

访问后浏览器输出结果为:

hello-test

下面我们来定义一个路由:

在application目录下的route.php中加入:'test' => 'index/index/test',


定义后,我们就可以直接访问下面的地址:


http://xxx.com/test

访问后浏览器输出结果和之前是一样的。

之前singwa做过2套实战课程,成功帮助很多小伙伴找到了心仪的工作

前端到后台ThinkPHP开发整站

ThinkPHP5实战-仿百度糯米开发多商家电商平台

备注:视频合作方-慕课网

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,853评论 18 139
  • 路由作用 1.根据实现定义的路由规则,检验URL请求,确定执行或者拒绝; 2.路由规则可自定义,隐藏了原URL地址...
    PlusNie阅读 2,696评论 1 5
  • [toc] 概述 由于ThinkPHP5.0默认采用的URL规则是: http://server/module/c...
    呦丶耍脾气阅读 8,407评论 0 1
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,215评论 22 257
  • 相信iOS开发过程中,肯定大多数人都知道Timer的释放不掉问题,但是否认真考虑过其中释放不掉的原因? NSTim...
    小小棒棒糖阅读 4,316评论 7 7