🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 闭包支持 [上一页](# "上一页")[下一页](# "下一页") ### 闭包定义 我们可以使用闭包的方式定义一些特殊需求的路由,而不需要执行控制器的操作方法了,例如: ~~~ '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! ~~~ [上一页](# "上一页")[下一页](# "下一页")