ThinkPHP路由详解


Posted in PHP onJuly 27, 2015

有了基本配置,我们就可以来访问我们的应用默认首页了。进入到项目目录,可以直接使用PHP内置服务器来开始访问,比如:

php -S localhost:8999

浏览器输入localhost:8999就可以看到ThinkPHP的默认首页了:一个笑脸。

在这里,我们访问到的是ThinkPHP自带的默认入口文件index.php也就是访问到的是IndexController的index()方法,这是因为ThinkPHP默认设置:

'DEFAULT_CONTROLLER'  => 'Index'

如果你查看过ThinkPHP/Conf/convention.php文件,应该就会明白这个其实就是设置默认的控制器。

关于控制器(Controller)我们后面会仔细说

了解这些基本知识之后,那么如果我们需要访问其它的页面,访问其他的控制器和方法呢?答案就在本节的路由教程中。

路由定义规则

在使用路由之前,确保你的URL支持PATH_INFO(或者兼容URL模式也可以,采用普通URL模式的情况下不支持路由功能)并且确认已开启一下的路由设置:

'URL_ROUTER_ON'  => true

这里涉及到两个设置项,PATH_INFO和URL_ROUTER_ON,这些在ThinkPHP/Conf/convention.php文件都可以找到。

在满足以上两个条件之后,就可以配置路由规则了。在配置文件中使用URL_ROUTE_RULES参数进行配置,配置格式是一个数组,其格式为: '路由表达式'=>'路由地址和传入参数'每个元素都代表一个路由规则,比如:

'URL_ROUTE_RULES'=>array(
  'blogs/:year/:month/:day' => array('Index/archive', 'status=1'),
  'blogs/:id'        => 'Index/read',
),

ThinkPHP按定义的顺序依次匹配路由规则,一旦匹配到的话,就会定位到路由定义中的控制器和操作方法去执行(你可以传入其他的参数),而后面的规则不会继续匹配

以上的路由配置说明:在每个路由表达式中,:后面跟参数名称,比如上面的:year,:month,:id都是参数名称,以:id为例,它指向Index控制器的read方法,这个方法接受一个$id的参数:

public function read($id){
    echo "read page with" .$id;
  }

在浏览器输入http://localhost:8999/index.php/Home/blogs/2就可以看到

read page with 2

Home就代表Home模块,你可以简单地将它映射到相应的Home目录,这是由于在默认的配置中

'DEFAULT_MODULE'    => 'Home'

你可以根据自己的需求修改,但本课依旧采用默认的Home模块.

如果你还需要传人额外的参数,像第一条的规则array('Index/archive', 'status=1')中的status一样传人,你看设置多个这样的参数。

如果你尝试在浏览器输入:

http://localhost:8999/index.php/Home/blogs/string

ThinkPHP也给我们返回了string,但在日常的开发中,我们通常需要限制:id变量是整数,那该怎么做呢?只需要稍稍改动就可以了,写成

'blogs/:id\d'        => 'Index/read',

以上\d表示限制变量id只能是数字。

对于可选参数,可以用[]包含表示,比如:

'blogs/:year/:month/[:day]' => array('Index/archive', 'status=1'),

上面的day现在就是可选参数了,你可以传人,也可以不传。

在ThinkPHP中,还支持在限制路由的后缀和使用正则路由。

限制路由后缀,通常使用在平时常见的html,htm等后缀,还是以上面的规则为例:

'blogs/:id'        => array('Index/read',array('ext'=>'html'))

你就可以限制这条规则只能在.html的路由后缀生效。

正则路由

正则本身就是一门很大的学问,在学习ThinkPHP的正则路由之前,最好是具备一定的正则表达式的基础。

路由表达式支持的正则定义必须以/开头,否则就视为规则表达式,比如:

'#^blog\/(\d+)$#' => 'Index/read'

这会解析为规则路由而不是正则路由,因为录音表达式并没有以/开始,所以,我们需要这样写:

'/^new\/(\d{4})\/(\d{2})$/' => 'Index/achive?year=:1&month=:2',
以上就是一条正确的正则路由。对于正则表达式中的每个正则规则子模式)部分(如\d{4}和\d{2}),如果需要在后面的路由地址中引用,可以采用:1、:2这样的方式,序号就是子模式的序号

静态路由

ThinkPHP框架其实还有一个路由机制叫静态路由,这实际上就是规则路由的静态简化版,路由定义中不包含动态参数(如上面的路由规则中id参数),静态路由不需要遍历路由规则而是直接定位,因此执行效率会较高。静态路由采用URL_MAP_RULES来定义规则:

'URL_ROUTER_ON'  => true,
'URL_MAP_RULES'=>array(
  'new/top' => 'Index/top?type=top'
)

由于Index/top?type=top中Index表示控制器,第一个top表示方法,所以我们需要在Index控制器中创建top方法:

public function top(){
    echo "top page </br>";
  }

根据上面这条规则,如果我们访问到

http://localhost:8999/index.php/Home/new/top

其实我们访问的是:

http://localhost:8999/index.php/Home/index/top/type/top
转译成就是new/top对应的是index控制器的top方法,传人的参数为type,参数值为top,所以就有了index/top/type/top

但是,当我们访问http://localhost:8999/index.php/Home/new/top/var/test尽管URL地址前面也有new/top,然而由于静态路由是完整匹配的性质,所以不会匹配到index/top/type/top

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
用IE远程创建Mysql数据库的简易程序
Oct 09 PHP
PHP读MYSQL中文乱码的解决方法
Dec 17 PHP
php 文件上传代码(限制jpg文件)
Jan 05 PHP
php in_array 函数使用说明与in_array需要注意的地方说明
Apr 13 PHP
php下载文件的代码示例
Jun 29 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
Aug 28 PHP
php获取网页里所有图片并存入数组的方法
Apr 06 PHP
YII Framework框架教程之安全方案详解
Mar 14 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
Jun 13 PHP
php版微信js-sdk支付接口类用法示例
Oct 12 PHP
PHP实现递归目录的5种方法
Oct 27 PHP
PHP对象相关知识总结
Apr 09 PHP
ThinkPHP安装和设置
Jul 27 #PHP
教你在PHPStorm中配置Xdebug
Jul 27 #PHP
关于PHP开发的9条建议
Jul 27 #PHP
Laravel 中获取上一篇和下一篇数据
Jul 27 #PHP
php实现将Session写入数据库
Jul 26 #PHP
php检测文本的编码
Jul 26 #PHP
PHP中COOKIES使用示例
Jul 26 #PHP
You might like
关于PHP session 存储方式的详细介绍
2013/06/25 PHP
php实现微信公众号主动推送消息
2015/12/31 PHP
[原创]php实现 data url的图片生成与保存
2016/12/04 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
javascript 表格排序和表头浮动效果(扩展SortTable)
2009/04/07 Javascript
Js切换功能的简单方法
2010/11/23 Javascript
JavaScript和CSS通过expression实现Table居中显示
2013/06/28 Javascript
可自己添加html的伪弹出框实现代码
2013/09/08 Javascript
javascript中this的四种用法
2015/05/11 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
js 作用域和变量详解
2017/02/16 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
2018/08/28 jQuery
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
[46:38]完美世界DOTA2联赛PWL S2 Magma vs PXG 第三场 11.28
2020/12/02 DOTA
Python 元类使用说明
2009/12/18 Python
python中利用Future对象回调别的函数示例代码
2017/09/07 Python
PyTorch CNN实战之MNIST手写数字识别示例
2018/05/29 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
对Python信号处理模块signal详解
2019/01/09 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
CSS3制作翻转效果_动力节点Java学院整理
2017/07/11 HTML / CSS
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
英国美术用品购物网站:Cass Art
2019/10/08 全球购物
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
汽车维修与检测专业应届生求职信
2013/11/12 职场文书
煤矿班组长的职责
2013/12/25 职场文书
家具厂厂长岗位职责
2014/01/01 职场文书
公司借条范本
2015/05/25 职场文书
Vue监视数据的原理详解
2022/02/24 Vue.js
Python探索生命起源 matplotlib细胞自动机动画演示
2022/04/21 Python
详解OpenCV曝光融合
2022/04/29 Python