赵童鞋带你入门PHP(七) ThinkPHP路由篇

阅读时长:10分钟

技术预备:ThinkPHP框架基础用法

上一章我们简单介绍了MVC框架的三大件:控制器、模型、视图,以及路由。

童鞋们还记得一个URL请求的执行过程吗?

没错,就是:路由->控制器->模型(->视图)。

这章我们还是按照赵童鞋一贯的风格,省略掉80%比较少用的功能,讲解一下TP5中路由的常用操作。

一、定义路由

上一章中,我们在Index控制器中新增了hello()方法,通过访问URL:

tp5.com/index/index…

就可以访问到hello()方法里的代码。(童鞋们记得课前先配置虚拟域名哦~)

这里就出现了一个问题,URL也太太太长了。

“懒惰的程序员们”想到了一个好办法去解决:定义一个短的URL去代替长的URL,也就是定义路由规则。

在TP5中定义应用的路由规则,直接在application/route.php文件中添加路由规则即可。

我们就定义一个hello路由到上面提到的index/index/hello操作。

框架为我们提供了两种定义方式。

静态注册:

动态注册:

静态注册和动态注册的规律是一样的:第一个参数称为路由规则(通过路由访问的地址),第二个参数为该规则对应的路由地址(也就是原来定义路由之前访问的URL地址)

赵童鞋推荐使用动态注册,动态注册是TP官方推荐的做法,同时也是Laravel等其他框架比较通用的做法,毕竟我们虽然学习了TP框架,但工作时并不一定会使用上,学会其中通用的部分最实际。

路由规则定义好之后,尝试访问URL:

tp5.com/hello

如果不出意外(你的Apache开没开?)的话,应该是访问到了下面这个页面:

我们尝试下访问原来的URL:

tp5.com/index/index…

会发现已经返回了页面错误。

这是因为TP5.0遵循唯一的URL地址设计。

二、指定请求类型

了解过HTTP协议的童鞋应该知道,在请求中最常用的就是GET和POST请求。

同样,我们可以很方便的为我们的路由制定请求类型,赵童鞋就用GET请求来举例。

我们继续使用上面提到的hello路由来举例,制定GET请求类型只需要将route.php文件修改为:

那么我们该怎么测试呢?这时候就需要用到我们之前安装的Postman来做了。

将请求方法设置为GET,填写URL:

tp5.com/hello

点击Send就可以看到,请求是成功返回的。

而我们将请求方法设置为POST,并点击Send。

可以看到,Status为404 Not Found,并且返回了错误页面。

POST路由规则指定就请童鞋们自己亲自尝试啦~

三、路由变量

在TP框架的路由中定义路由变量也非常简单。

只需要在定义路由规则时,加入你想接收的变量,如下图:

接着在hello()方法中获取变量,如下图:

访问URL:

tp5.com/hello/zhaot…

就可以看到,成功的获取到了URL中传递的路由变量。

四、路由分组

在实际的使用中,会涉及到大量的相同URL前缀的路由规则,例如下面的一组路由:

而路由分组就能够解决这个问题。

五、总结

本章我们学到了四个路由操作:定义路由、指定请求类型、路由变量、路由分组,如果再加上依赖注入(DI)这种设计模式就可以很容易地去实现Api开发中的RESTful Api风格。

TP5中的路由功能远远不止以上这四种,还有许多的例如:别名路由、资源路由、伪静态访问、操作方法前缀等操作,但是日常的开发中会比较少用到,有兴趣地童鞋可以参考官方文档来更深入地了解路由功能。

下一章我们就会进入到控制器的讲解。

你们以为本章到此结束了吗???

错!!!

下面开始进行进阶模式:

六、路由进阶

上面我们学习到了路由的使用方法,童鞋们好不好奇为什么在route.php中定义了规则后,框架能够为我们的请求(Request)导航到指定的控制器(Controller)和操作(Action)呢?

路由小朋友究竟都干了些什么呢?

我们下面来探究一下TP5中路由的秘密。

本次我们使用刚写好的路由规则“hello/:name”来进行举例。

首先我们来到入口文件index.php。

可以看到,index.php实际功能只是加载了thinkphp/start.php这个文件,那我们就去这个文件里看看。

start.php文件其实才是真正的框架入口,它调用了App类的run()方法,从方法名我们可以看出,整个框架就是在这里开始跑起来的。

我们进入到run()方法中看看这里有没有路由相关的操作,在run()方法中搜索关键字“route”。

在这里发现了一个routeCheck()方法,这个就是路由干的好事:检测当前的request究竟要调用什么东西。

在这个方法里,TP5的路由检测一共分为了几个阶段:判断是否开启路由、读取路由缓存、导入路由配置、路由检测等。

其中的导入路由配置就是加载了route.php文件中的路由规则。

而我们需要看的,应该就是其中的路由检测阶段,也就是Route::check()方法。

由于我们本次举例的路由规则“hello/:name”是动态路由规则,所以最终代码会进入到checkRoute(),这个方法里面会检测我们在route.php文件中配置的规则,并最终返回我们需要调用的代码位置。

checkRoute()中开头就有一个foreach,而循环遍历的变量$rules就是我们在route.php中配置的所有路由规则。

checkRoute()做完请求参数有效性校验后,就会把解析出来的路由规则放到checkRule()中进行规则定义检测

做完一大堆的检测后,第一个重点来了,checkRule()就会把请求url和规则rule放到match()方法中进行匹配。

match()匹配规则成功之后,就轮到第二个重点了,框架会调用parseRule()来进行解析路由规则。

继续往下看,TP5就是调用这段代码来进行路由规则解析:

parseRule()方法最后会返回一个$result变量,使用XDEBUG可以看到返回值为一个数组,其中包括了三个重要的信息:index模块、index控制器、hello方法。(如果不会配置XDEBUG的童鞋可以在公众号后台给赵童鞋留言哦~)

接下来回到最最最上层的App:run()方法中查看,routeCheck()方法的返回值$dispatch就是刚才解析出来的路由地址。

接下来TP5就会将解析出来的信息扔到exec()方法中执行,通过查看exec()方法可以知道,框架会根据返回值中的type来进行路由分发。

接下来……Stop!!!

再往下就是控制器(Controller)的领域了

童鞋们有没有在框架源码的海洋绕晕了呢?

欲知后事如何,请听下回分解。

----- End -----

更多好文

请扫描下面二维码

欢迎关注~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值