一.路由定义
开启路由
'URL_ROUTER_ON' => true, //开启路由
'URL_ROUTE_RULES' => array( //定义路由规则
'new/:id\d' => 'News/read',
'new/:name' => 'News/read',
'new/:year\d/:month\d' => 'News/archive',
),
1.规则路由
每个参数中以“:”开头的参数都表示动态参数
下面代码表示传的值有 new 、$_GET['year']、$_GET['month']、$_GET['day']
=>之后表示匹配的路由发送到哪个方法 规则表达式的定义始终以“/”为参数分割符
'new/:year/:month/:day'=>'News/read', // 静态地址和动态地址结合
规则匹配检测的时候只是对URL从头开始匹配,只要URL地址包含了定义的路由规则就会匹配成功,如果希望完全匹配,可以使用$符号,例如:
'new/:cate$'=> 'News/category'
* http://serverName/index.php/Home/new/info
会匹配成功,而
http://serverName/index.php/Home/new/info/2
则不会匹配成功。
2.正则路由
路由表达式支持的正则定义必须以“/”开头,否则就视为规则表达式。
'#^blog\/(\d+)$#' => 'Blog/read/id/:1'//错误
'/^new\/(\d{4})\/(\d{2})$/' => 'News/achive?year=:1&month=:2', //正确
3.闭包支持
我们可以使用闭包的方式定义一些特殊需求的路由,而不需要执行控制器的操作方法了,例如:
'URL_ROUTE_RULES'=>array(
'test' =>
function(){
echo 'just test';
},
'hello/:name' =>
function($name){
echo 'Hello,'.$name;
}
)
规则路由的参数传递比较简单:
'hello/:name' =>
function($name){
echo 'Hello,'.$name;
}
如果多个参数可以使用:
'blog/:year/:month' =>
function($year,$month){
echo 'year='.$year.'&month='.$month;
}
如果是正则路由的话,闭包函数中的参数就以正则中出现的参数次序来传递,例如:
'/^new\/(\d{4})\/(\d{2})$/' =>
function($year,$month){
echo 'year='.$year.'&month='.$month;
}
默认的情况下,使用闭包定义路由的话,一旦匹配到路由规则,执行完闭包方法之后,就会中止后续执行。如果希望闭包函数执行后,后续的程序继续执行,可以在闭包函数中使用布尔类型的返回值,例如:
'hello/:name' =>
function($name){
echo 'Hello,'.$name.'<br/>';
$_SERVER['PATH_INFO'] = 'blog/read/name/'.$name;
return false;
}
该路由定义中的闭包函数首先执行了一段输出代码,然后重新设置了$_SERVER['PATH_INFO']
变量,交给后续的程序继续执行,因为返回值是false,所以会继续执行控制器和操作的检测,从而会执行Blog控制器的read操作方法。
假设blog控制器中的read操作方法代码如下:
public function read($name){
echo 'read,'.$name.'!<br/>';
}
如果我们访问的URL地址是: http://serverName/Home/hello/thinkphp
则浏览器输出的结果是:
Hello,thinkphp
read,thinkphp!
4.实例
'URL_ROUTER_ON' => true, //开启路由
'URL_ROUTE_RULES' => array( //定义路由规则
'new/:id\d' => 'News/read',
'new/:name' => 'News/read',
'new/:year\d/:month\d' => 'News/archive',
),
然后,我们访问: http://serverName/index.php/Home/new/8
会匹配到第一个路由规则,实际执行的效果等效于访问: http://serverName/index.php/Home/News/read/id/8
当访问: http://serverName/index.php/Home/new/hello
会匹配到第二个路由规则,实际执行的效果等效于访问: http://serverName/index.php/Home/News/read/name/hello
那么如果访问: http://serverName/index.php/Home/new/2012/03
是否会匹配第三个路由规则呢?我们期望的实际执行的效果能够等效于访问: http://serverName/index.php/Home/News/archive/year/2012/month/03
事实上却没有,因为http://serverName/index.php/Home/new/2012/
这个URL在进行路由匹配过程中已经优先匹配到了第一个路由规则了,把2012当成id的值传入了