阅读时长:10分钟
技术预备:ThinkPHP框架基础用法
上一章我们简单介绍了MVC框架的三大件:控制器、模型、视图,以及路由。
童鞋们还记得一个URL请求的执行过程吗?
没错,就是:路由->控制器->模型(->视图)。
这章我们还是按照赵童鞋一贯的风格,省略掉80%比较少用的功能,讲解一下TP5中路由的常用操作。
一、定义路由
上一章中,我们在Index控制器中新增了hello()方法,通过访问URL:
就可以访问到hello()方法里的代码。(童鞋们记得课前先配置虚拟域名哦~)
这里就出现了一个问题,URL也太太太长了。
“懒惰的程序员们”想到了一个好办法去解决:定义一个短的URL去代替长的URL,也就是定义路由规则。
在TP5中定义应用的路由规则,直接在application/route.php文件中添加路由规则即可。
我们就定义一个hello路由到上面提到的index/index/hello操作。
框架为我们提供了两种定义方式。
静态注册:
动态注册:
静态注册和动态注册的规律是一样的:第一个参数称为路由规则(通过路由访问的地址)
,第二个参数为该规则对应的路由地址(也就是原来定义路由之前访问的URL地址)
赵童鞋推荐使用动态注册,动态注册是TP官方推荐的做法,同时也是Laravel等其他框架比较通用的做法,毕竟我们虽然学习了TP框架,但工作时并不一定会使用上,学会其中通用的部分最实际。
路由规则定义好之后,尝试访问URL:
如果不出意外(你的Apache开没开?)
的话,应该是访问到了下面这个页面:
我们尝试下访问原来的URL:
会发现已经返回了页面错误。
这是因为TP5.0遵循唯一的URL地址设计。
二、指定请求类型
了解过HTTP协议的童鞋应该知道,在请求中最常用的就是GET和POST请求。
同样,我们可以很方便的为我们的路由制定请求类型,赵童鞋就用GET请求来举例。
我们继续使用上面提到的hello路由来举例,制定GET请求类型只需要将route.php文件修改为:
那么我们该怎么测试呢?这时候就需要用到我们之前安装的Postman来做了。
将请求方法设置为GET,填写URL:
点击Send就可以看到,请求是成功返回的。
而我们将请求方法设置为POST,并点击Send。
可以看到,Status为404 Not Found,并且返回了错误页面。
POST路由规则指定就请童鞋们自己亲自尝试啦~
三、路由变量
在TP框架的路由中定义路由变量也非常简单。
只需要在定义路由规则时,加入你想接收的变量,如下图:
接着在hello()方法中获取变量,如下图:
访问URL:
就可以看到,成功的获取到了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 -----
更多好文
请扫描下面二维码
欢迎关注~