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 相关文章推荐
新版PHP极大的增强功能和性能
Oct 09 PHP
PHP中将数组转成XML格式的实现代码
Aug 08 PHP
php获取文件内容最后一行示例
Jan 09 PHP
PHP中echo和print的区别
Aug 28 PHP
php使用unset()删除数组中某个单元(键)的方法
Feb 17 PHP
php pdo oracle中文乱码的快速解决方法
May 16 PHP
php抛出异常与捕捉特定类型的异常详解
Oct 26 PHP
PHP命名空间namespace的定义方法详解
Mar 29 PHP
php 调用ffmpeg获取视频信息的简单实现
Apr 03 PHP
php 生成加密公钥加密私钥实例详解
Jun 16 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
Laravel框架基于ajax实现二级联动功能示例
Jan 17 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后台如何避免用户直接进入方法实例
2013/10/15 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
jquery BS,dialog控件自适应大小
2009/07/06 Javascript
jquery tab标签页的制作
2010/05/10 Javascript
JavaScript传递变量: 值传递?引用传递?
2011/02/22 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
深入理解javascript中return的作用
2013/12/30 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
node+express+jade制作简单网站指南
2014/11/26 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
JavaScript检测原始值、引用值、属性
2016/06/20 Javascript
Bootstrap图片轮播组件使用实例解析
2016/06/30 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
Angular排序实例详解
2017/06/28 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
JS实现图片切换效果
2018/11/17 Javascript
Vue实现省市区三级联动
2020/12/27 Vue.js
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
python读取Excel实例详解
2018/08/17 Python
python程序文件扩展名知识点详解
2020/02/27 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
HTML5的革新 结构之美
2011/06/20 HTML / CSS
River Island美国官网:英国高街时尚品牌
2018/09/04 全球购物
意大利值得信赖的在线超级药房:PillolaStore
2020/02/05 全球购物
vue实现倒计时功能
2021/03/24 Vue.js
音乐专业应届生教师求职信
2013/11/04 职场文书
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
应届生求职信范文
2014/06/30 职场文书
奉献家乡演讲稿
2014/09/16 职场文书
2015年驾驶员工作总结
2015/04/29 职场文书
网络妈妈观后感
2015/06/08 职场文书
学校教学管理制度
2015/08/06 职场文书
2019广播稿怎么写
2019/04/17 职场文书