闭包定义

我们可以使用闭包的方式定义一些特殊需求的路由,而不需要执行控制器的操作方法了,例如:

  1. ​'URL_ROUTE_RULES'=>array(​
  2. ​ 'test' =>​
  3. ​ function(){​
  4. ​ echo 'just test';​
  5. ​ },​
  6. ​ 'hello/:name' =>​
  7. ​ function($name){​
  8. ​ echo 'Hello,'.$name;​
  9. ​ }​
  10. ​)​

参数传递

闭包定义的参数传递在规则路由和正则路由的两种情况下有所区别。

规则路由

规则路由的参数传递比较简单:

  1. ​'hello/:name' =>​
  2. ​ function($name){​
  3. ​ echo 'Hello,'.$name;​
  4. ​ }​

规则路由中定义的动态变量的名称 就是闭包函数中的参数名称,不分次序。 因此,如果我们访问的URL地址是: ​​http://serverName/Home/hello/thinkphp​

则浏览器输出的结果是: ​​Hello,thinkphp​

如果多个参数可以使用:

  1. ​'blog/:year/:month' =>​
  2. ​ function($year,$month){​
  3. ​ echo 'year='.$year.'&month='.$month;​
  4. ​ }​
正则路由

如果是正则路由的话,闭包函数中的参数就以正则中出现的参数次序来传递,例如:

  1. ​'/^new\/(\d{4})\/(\d{2})$/' =>​
  2. ​ function($year,$month){​
  3. ​ echo 'year='.$year.'&month='.$month;​
  4. ​ }​

如果我们访问: ​​http://serverName/Home/new/2013/03​​ 浏览器输出结果是: ​​year=2013&month=03​

继续执行

默认的情况下,使用闭包定义路由的话,一旦匹配到路由规则,执行完闭包方法之后,就会中止后续执行。如果希望闭包函数执行后,后续的程序继续执行,可以在闭包函数中使用布尔类型的返回值,例如:

  1. ​'hello/:name' =>​
  2. ​ function($name){​
  3. ​ echo 'Hello,'.$name.'<br/>';​
  4. ​ $_SERVER['PATH_INFO'] = 'blog/read/name/'.$name;​
  5. ​ return false;​
  6. ​ }​

该路由定义中的闭包函数首先执行了一段输出代码,然后重新设置了​​$_SERVER['PATH_INFO']​​变量,交给后续的程序继续执行,因为返回值是false,所以会继续执行控制器和操作的检测,从而会执行Blog控制器的read操作方法。

假设blog控制器中的read操作方法代码如下:

  1. ​public function read($name){​
  2. ​ echo 'read,'.$name.'!<br/>';​
  3. ​}​

如果我们访问的URL地址是: ​​http://serverName/Home/hello/thinkphp​

则浏览器输出的结果是:​

  1. ​Hello,thinkphp​
  2. ​read,thinkphp!​