【Thinkphp教程】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'
-
路由规则中的静态地址部分不区分大小写
-
'URL_ROUTER_ON' => true, //开启路由
-
'URL_ROUTE_RULES' => array( //定义路由规则
-
'news/:year/:month/:day' => array('News/archive', 'status=1'),
-
'news/:id' => 'News/read',
-
'news/read/:id' => '/news/:1',
-
),
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
那么解析规则就会混淆,但是我们可以更改路由规则如下:
-
'URL_ROUTER_ON' => true, //开启路由
-
'URL_ROUTE_RULES' => array( //定义路由规则
-
'news/:year/:month/:day' => array('News/archive', 'status=1'),
-
'news/:id\d' => 'News/read',
-
'news/:name' => 'News/read',
-
'news/read/:id' => '/news/:1',
-
),
而 news/:name 规则定义 则会匹配所有的字符情况,这也是默认的情况,目前规则路由只区分数字和所有字符的情况,如果需要严格的类型约束,请采用正则路由定义规则。
-
class CityAction extends Action{
-
public function city(){
-
//读取城市名
-
$cityName = $_GET['name'];
-
echo '当前城市' . $cityName;
-
}
-
}
-
'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
-
'URL_ROUTER_ON' => true, //开启路由
-
'URL_ROUTE_RULES' => array( //定义路由规则
-
':user/bolg/:id' => 'Blog/read',
-
':user/:blog_name' => 'Blog/read',
-
),
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 的方式
-
'URL_ROUTER_ON' => true, //开启路由
-
'URL_ROUTE_RULES' => array( //定义路由规则
-
'/^blog\/(\d+)$/' => 'Blog/read?id=:1',
-
'/^blog\/(\d+)\/(\d+)$/' => 'Blog/achive?year=:1&month=:2',
-
'/^blog\/(\d+)_(\d+)$/' => 'blog.php?id=:1&page=:2',
-
),