【Thinkphp教程】URL路由功能解析

ThinkPHP支持URL路由功能,要启用路由功能,需要设置URL_ROUTER_ON 参数为true。开启路由功能后,并且配置URL_ROUTE_RULES参数后,系统会自动进行路由检测,如果在路由定义里面找到和当前URL匹配的路由名称,就会进行路由解析和重定向。
3.0版本的路由支持做了增强,包含规则路由和正则路由支持。
一、规则路由
规则路由是由2.1版本的简单路由进化而来,定义格式为:
格式1:'路由规则'=>'[分组/模块/操作]?额外参数1=值1&额外参数2=值2...'
格式2:'路由规则'=>array('[分组/模块/操作]','额外参数1=值1&额外参数2=值2...')
格式3:'路由规则'=>'外部地址'
格式4:'路由规则'=>array('外部地址','重定向代码')
注意事项
  • 路由规则中如果以“:”开头,表示动态变量,否则为静态地址

  • 格式2的额外参数可以传入数组或者字符串

  • 外部地址中如果要引用动态变量, 采用 :1、:2 的方式

  • 路由规则支持变量的数字约束定义,例如:'news/:id\d'=>'News/read'

  • 规则路由可以支持 全动态和动静结合定义,例如':user/blog/:id'=>'Home/Blog/user'

  • 路由规则非数字变量支持排除,例如 'news/:cate^add|edit|delete'=>'News/category'

  • 路由规则中的静态地址部分不区分大小写

下面是规则路由的定义示例:

  1. 'URL_ROUTER_ON'   => true, //开启路由

  2. 'URL_ROUTE_RULES' => array( //定义路由规则

  3.     'news/:year/:month/:day' => array('News/archive', 'status=1'),

  4.     'news/:id'               => 'News/read',

  5.     'news/read/:id'          => '/news/:1',

  6. ),


其中定义了3条路由规则,如果我们访问下面的URL
http://serverName/index.php/news/8
http://serverName/index.php/news/10
则会会匹配到第二条规则路由,并解析到News模块的read操作,而且后面的数字会传入$_GET['id']变量。
如果我们访问下面的URL
http://serverName/index.php/news/2012/01/08
http://serverName/index.php/news/2012/01/15
则会匹配到第一条规则路由,并解析到News模块的archive操作,而且会传入year、month和day的GET变量。
第二条路由规则还可以改成
'news/:year/:month/:day/'=>'News/archive?status=1',
通常情况下,需要传入数组参数的时候才会需要使用格式数组来定义
第三条路由规则是一个路由重定向,一般是用于网站改版后的URL迁移,如果之前的URL访问规则是
http://serverName/index.php/news/read/8
那么会重定向到新的内部路由规则
http://serverName/index.php/news/8
这里之所以用了重定向路由是为了告诉搜索引擎这些地址已经发生改变了 而且以后是不需要保留。
有些情况下,可能会存在冲突,假如要支持通过标识来访问文章,
http://serverName/index.php/news/hello_world
那么解析规则就会混淆,但是我们可以更改路由规则如下:

  1. 'URL_ROUTER_ON'   => true, //开启路由

  2. 'URL_ROUTE_RULES' => array( //定义路由规则

  3.     'news/:year/:month/:day' => array('News/archive', 'status=1'),

  4.     'news/:id\d'             => 'News/read',

  5.     'news/:name'             => 'News/read',

  6.     'news/read/:id'          => '/news/:1',

  7. ),


news/:id\d 规则表示当URL中id参数为数字时才会匹配
而 news/:name 规则定义 则会匹配所有的字符情况,这也是默认的情况,目前规则路由只区分数字和所有字符的情况,如果需要严格的类型约束,请采用正则路由定义规则。
举个例子,我们现在用规则路由来实现之前用空操作实现的城市功能,我们定义了City控制器如下:

  1. class CityAction extends Action{

  2.     public function city(){

  3.         //读取城市名

  4.          $cityName = $_GET['name'];

  5.         echo '当前城市' . $cityName;

  6.     }

  7. }


我们只需要定义下面的路由规则

  1. 'city/:name'  =>'City/city'


就能实现之前用空操作实现的同样功能了。
接下来,我们就可以在浏览器里面输入
http://serverName/index.php/City/beijing/
http://serverName/index.php/City/shanghai/
http://serverName/index.php/City/shenzhen/
会看到依次输出的结果是:
当前城市:beijing
当前城市:shanghai
当前城市:Shenzhen
规则路由可以支持动态和静态混合甚至是全动态,例如:

  1. 'URL_ROUTER_ON'   => true, //开启路由

  2. 'URL_ROUTE_RULES' => array( //定义路由规则

  3.     ':user/bolg/:id'   => 'Blog/read',

  4.     ':user/:blog_name' => 'Blog/read',

  5. ),


第一条路由会匹配下列URL访问
http://serverName/index.php/user1/blog/25/
http://serverName/index.php/username2/blog/245/
并解析到Blog模块的read操作方法 ,传入user和id两个GET参数。
第二条路由会匹配到下面的URL访问
http://serverName/index.php/user1/hello_world
http://serverName/index.php/username2/test_nme
同样解析到Blog模块的read操作方法,只是传入的参数变成blog_name 一个GET参数。
二、正则路由
正则路由可以实现更加复杂的路由定义,支持的定义格式如下:
格式1:'路由正则'=>'[分组/模块/操作]?参数1=值1&参数2=值2...'
格式2:'路由正则'=>array('[分组/模块/操作]','参数1=值1&参数2=值2...') 格式3:'路由正则'=>'外部地址'
格式4:'路由正则'=>array('外部地址','重定向代码') 
注意事项:
  • 正则路由规则必须以“/”开始和结束

  • 格式2的参数可以传入数组或者字符串

  • 参数值和外部地址中可以用动态变量 采用 :1、 :2 的方式

下面是正则路由的定义示例:

  1. 'URL_ROUTER_ON'   => true, //开启路由

  2. 'URL_ROUTE_RULES' => array( //定义路由规则

  3.     '/^blog\/(\d+)$/'        => 'Blog/read?id=:1',

  4.     '/^blog\/(\d+)\/(\d+)$/' => 'Blog/achive?year=:1&month=:2',

  5.     '/^blog\/(\d+)_(\d+)$/'  => 'blog.php?id=:1&page=:2',

  6. ),


posted @ 2013-05-17 14:20  飞鱼flyfish  阅读(444)  评论(0编辑  收藏  举报