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新手NOTICE错误常见解决方法
Dec 07 PHP
php+iframe实现隐藏无刷新上传文件
Feb 10 PHP
解析thinkphp import 文件内容变量失效的问题
Jun 20 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
Jun 21 PHP
跟我学Laravel之配置Laravel
Oct 15 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
Nov 03 PHP
PHP处理CSV表格文件的常用操作方法总结
Jul 01 PHP
php基于数组函数实现关联表的编辑操作示例
Jul 04 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
PHP 文件写入和读取操作实例详解【必看篇】
Nov 04 PHP
thinkphp5 redis缓存新增方法实例讲解
Mar 24 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
MySQL 日期时间函数常用总结
2012/06/12 PHP
PHP实现多文件上传的方法
2015/07/08 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
用javascript getComputedStyle获取和设置style的原理
2008/10/10 Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
Javascript实现滑块滑动改变值的实现代码
2013/04/12 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
JavaScript sub方法入门实例(把字符串显示为下标)
2014/10/17 Javascript
JavaScript中的值类型详细介绍
2014/12/29 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
jquery中each循环的简单回滚操作
2017/05/05 jQuery
JavaScript简介_动力节点Java学院整理
2017/06/26 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
2019/06/21 Javascript
Node.js实现简单的爬取的示例代码
2019/06/25 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
Python的时间模块datetime详解
2017/04/17 Python
Python时间的精准正则匹配方法分析
2017/08/17 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
2020/02/28 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
加拿大票务网站:Ticketmaster加拿大
2017/07/17 全球购物
时尚孕妇装:HATCH Collection
2019/09/24 全球购物
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
党的群众路线教育实践活动通讯稿
2014/09/10 职场文书
乡镇三严三实学习心得体会
2014/10/13 职场文书
计算机专业自荐信
2015/03/05 职场文书
英雄儿女观后感
2015/06/09 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python