ThinkPHP的路由功能解析

发布时间:2020-08-15编辑:脚本学堂
本文通过实例介绍下ThinkPHP框架中,有关URL路由功能的一些内容,感兴趣的朋友可以参考学习下。

本节内容:
thinkphp的路由功能

说明:
在ThinkPHP框架中,是支持URL路由功能,要启用路由功能,需要设置ROUTER_ON 参数为true。

开启路由功能后,系统会自动进行路由检测,如果在路由定义里面找到和当前URL匹配的路由名称,就会进行路由解析和重定向

路由功能需要定义路由定义文件,位于项目的配置目录下面,文件名为routes.php,定义格式:
 

复制代码 代码示例:
<?php
Return Array(      
// 第一种方式 常规路由      
 'RouteName'=>array('模块名称','操作名称','参数定义','额外参数'),      
// 第二种方式 泛路由      
‘RouteName@’=>array(      
array('路由匹配正则','模块名称','操作名称','参数定义','额外参数'),      
),      
…更多的路由名称定义      
)    
 

或者
 

复制代码 代码示例:
<?php
$_routes = Array(      
 'RouteName'=>array('模块名称','操作名称','参数定义','额外参数'),      
'RouteName@'=>array(      
array('路由匹配正则','模块名称','操作名称','参数定义','额外参数'),      
),      
…更多的路由名称定义      
)    

系统在执行Dispatch解析时,会判断当前URL是否存在定义的路由名称,如果有就会按照定义的路由规则来进行URL解析。
例如,启用了路由功能,并且定义了下面的一个路由规则:
 

复制代码 代码示例:
<?php
'blog'=>array('Blog','index','year,month,day','userId=1&status=1')   
 

那么在执行
http://serverName/appName/blog/2007/9/15/时就会实际执行Blog模块的index操作,后面的参数/2007/9/15/ 就会依次按照 year/month/day 来解析,并且会隐含传入userId=1和status=1 两个参数。

另外一种路由参数的传入:
http://serverName/appName/?r=blog&year=2007&month=9&day=15,会执行上面相同的路由解析,该方式主要是提供不支持PATHINFO方式下面的兼容实现。其中r由VAR_ROUTER参数定义,默认是r。

泛路由支持
新版引入了泛路由支持,提供了对同一个路由名称的多个规则的支持,使得URL的设置更加灵活。
例如,对Blog路由名称需要有多个规则的路由:
 

复制代码 代码示例:
'Blog@'=>array(      
 array('/^/(d+)(/p/d)?$/','Blog','read','id'),      
 array('/^/(d+)/(d+)/','Blog','archive','year,month'),      
 ),    
 

第一个路由规则表示解析 Blog/123 这样的URL到Blog模块的read操作
第二个路由规则表示解析 Blog/2007/08 这样的URL到Blog模块的archive操作
泛路由的定义难度就在路由正则的定义上面,其它参数和常规路由的使用一致。

一个简单的简单路由的例子:
如果有一个City模块,而希望能够通过类似下面这样的url地址来访问具体某个城市的操作:
http://serverName/index.php/City/shanghai/
shanghai这个操作方法是不存在的,给相关的城市操作定义了一个city方法,如下:
 

复制代码 代码示例:
<?php
Class CityAction extends Action{       
public function city(){       
// 读取城市名称       
$cityName = $_GET['name'];       
echo ('当前城市:'.$cityName);       
}       
}    
 

接下来来定义路由文件,实现类似于
http://serverName/index.php/City/shanghai/

这样的解析,路由文件名称:
 

复制代码 代码示例:
Return array(       
'City'=>array('City','city','name');       
);    

这样,URL里面所有的City模块都会被路由到City模块的city操作,而后面的第二个参数会被解析成 $_GET[‘name’]
接下来,就可以在浏览器里面输入:
http://serverName/index.php/City/beijing/
http://serverName/index.php/City/shanghai/
http://serverName/index.php/City/shenzhen/

输出结果:
当前城市:beijing
当前城市:shanghai
当前城市:shenzhen