闭包支持
闭包定义
我们可以使用闭包的方式定义一些特殊需求的路由,而不需要执行控制器的操作方法了,例如:
"URL_ROUTE_RULES"=>array(
"test" =>
function(){
echo "just test";
},
"hello/:name" =>
function($name){
echo "Hello,".$name;
}
)
参数传递
闭包定义的参数传递在规则路由和正则路由的两种情况下有所区别。
规则路由
规则路由的参数传递比较简单:
"hello/:name" =>
function($name){
echo "Hello,".$name;
}
规则路由中定义的动态变量的名称 就是闭包函数中的参数名称,不分次序。 因此,如果我们访问的URL地址是: http://serverName/Home/hello/thinkphp
则浏览器输出的结果是: Hello,thinkphp
如果多个参数可以使用:
"blog/:year/:month" =>
function($year,$month){
echo "year=".$year."&month=".$month;
}
正则路由
如果是正则路由的话,闭包函数中的参数就以正则中出现的参数次序来传递,例如:
"/^new/(d{4})/(d{2})$/" =>
function($year,$month){
echo "year=".$year."&month=".$month;
}
如果我们访问: http://serverName/Home/new/2013/03
浏览器输出结果是: year=2013&month=03
继续执行
默认的情况下,使用闭包定义路由的话,一旦匹配到路由规则,执行完闭包方法之后,就会中止后续执行。如果希望闭包函数执行后,后续的程序继续执行,可以在闭包函数中使用布尔类型的返回值,例如:
"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!