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 相关文章推荐
将RTF格式的文件转成HTML并在网页中显示的代码
Oct 09 PHP
MySQL修改密码方法总结
Mar 25 PHP
php将数据库导出成excel的方法
May 07 PHP
php 数据库字段复用的基本原理与示例
Jul 22 PHP
PHP面向对象学习笔记之一 基础概念
Oct 06 PHP
PHP面向对象——访问修饰符介绍
Nov 08 PHP
PHP 快速排序算法详解
Nov 10 PHP
php生成Android客户端扫描可登录的二维码
May 13 PHP
记录一次排查PHP脚本执行卡住的问题
Dec 27 PHP
PHP多进程之pcntl_fork的实例详解
Oct 15 PHP
php微信扫码支付 php公众号支付
Mar 24 PHP
PHP 文件上传限制问题
Sep 01 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
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
php 二维数组快速排序算法的实现代码
2017/10/17 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
基于jquery的动态创建表格的插件
2011/04/05 Javascript
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
js中substring和substr的定义和用法
2014/05/05 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
JavaScript sub方法入门实例(把字符串显示为下标)
2014/10/17 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
easyui validatebox验证
2016/04/29 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
javascript实现循环广告条效果
2017/12/12 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
使用element-ui table expand展开行实现手风琴效果
2019/03/15 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
2019/04/10 Javascript
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
Python简单定义与使用字典dict的方法示例
2017/07/25 Python
python 文件查找及内容匹配方法
2018/10/25 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
2019/04/04 Python
Python语言进阶知识点总结
2019/05/28 Python
python中@property和property函数常见使用方法示例
2019/10/21 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
如何基于Python代码实现高精度免费OCR工具
2020/06/18 Python
基于Python组装jmx并调用JMeter实现压力测试
2020/11/03 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
编程输出如下图形
2013/11/24 面试题
电脑教师的教学自我评价
2013/11/26 职场文书
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
2014年统战工作总结
2014/12/09 职场文书
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android