ThinkPHP的URL路由

ThinkPHP支持URL路由功能,要启用路由功能,需要设置URL_ROUTER_ON 参数为true。开启路由功能后,系统会自动进行路由检测,如果在路由定义里面找到和当前URL匹配的路由名称,就会进行路由解析和重定向。路由功能需要定义路由定义文件,位于项目的配置目录下面,文件名为routes.php,定义格式:

折叠 PHP Code 复制内容到剪贴板
  1. return array(   
  2. // 第一种方式 常规路由   
  3. 'RouteName'=>array('模块名称''操作名称''参数定义''额外参数'),   
  4. // 第二种方式 泛路由   
  5. 'RouteName@'=>array(   
  6. array('路由匹配正则''模块名称''操作名称''参数定义''额外参数'),   
  7. ),   
  8. …更多的路由名称定义   
  9. )   

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

'blog'=>array('Blog', 'archive', 'year,month,day', 'userId=1&status=1')
那么我们在执行
http://<serverName>/appName/blog/2009/10/1/ 的时候就会实际执行Blog模块的archive操作,后面的参数/2009/10/1/ 就会依次按照 year/month/day 来解析,并且会隐含传入userId=1和status=1 两个参数。
另外一种路由参数的传入是
http://<serverName>/appName/?r=blog&year=2009&month=10&day=1,会执行上面相同的路由解析,该方式主要是提供不支持PATHINFO方式下面的兼容实现。其中r由VAR_ROUTER参数定义,默认是r。
如果需要路由到分组模块的话,可以定义成
'blog'=>array('Home.Blog', 'archive', 'year,month,day', 'userId=1&status=1')
就可以指定路由到Home分组的Blog模块。
 
泛路由支持
泛路由指的是对同一个路由名称提供了多个规则的支持,使得URL的设置更加灵活,例如,我们对Blog路由名称需要有多个规则的路由:
折叠 PHP Code 复制内容到剪贴板
  1. 'Blog@'=>array(   
  2.           array('/^\/(\d+)(\/p\/\d)?$/','Blog','read','id'),   
  3.           array('/^\/(\d+)\/(\d+)/','Blog','archive','year,month'),   
  4.        ),   
第一个路由规则表示解析 Blog/123 这样的URL到Blog模块的read操作
第二个路由规则表示解析 Blog/2009/10 这样的URL到Blog模块的archive操作
泛路由的定义难度就在路由正则的定义上面,其它参数和常规路由的使用一致。
 
举个简单路由的例子,如果我们有一个City模块,而我们希望能够通过类似下面这样的URL地址来访问具体某个城市的操作:
http://<serverName>/index.php/City/shanghai/
shanghai这个操作方法是不存在的,我们给相关的城市操作定义了一个city方法,如下:
折叠 PHP Code 复制内容到剪贴板
  1. class CityAction extends Action{    
  2.      public function city(){    
  3.         // 读取城市名称    
  4.          $cityName = $_GET['name'];    
  5.         echo ('当前城市: '.$cityName);    
  6.      }    
  7. }   
接下来我们来定义路由文件,实现类似于
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值