路由
利用路由功能,可以让你的URL地址更加简洁和优雅。ThinkPHP支持对模块的URL地址进行路由操作(路由功能是针对PATHINFO模式或者兼容URL而设计的,暂时不支持普通URL模式)。
路由功能可以针对模块,也可以针对全局,针对模块的路由则需要在模块配置文件中开启和设置路由,如果是针对全局的路由,则是在公共模块的配置文件中开启和设置
模块路由和全局路由配置的区别在于,全局路由的路由地址必须包含模块。
启用路由
启用路由
'URL_ROUTER_ON' => true,
路由规则配置:
模块的配置文件中使用**URL_ROUTE_RULES**参数进行配置,配置格式是一个数组,每个元素都代表一个路由规则
'URL_ROUTE_RULES'=>array(
'news/:year/:month/:day' => array('News/archive', 'status=1'),
'news/:id' => 'News/read',
'news/read/:id' => '/news/:1',
),
路由的定义
'路由表达式'=>'路由地址'或者:array('路由表达式','路由地址','传入参数')
路由表达式包括规则路由和正则路由的定义表达式,只能使用字符串。
-
规则路由表达式
规则表达式通常包含静态地址和动态地址,或者两种地址的结合。
'my' => 'Member/myinfo', // 静态地址路由
'blog/:id' => 'Blog/read', // 静态地址和动态地址结合
'new/:year/:month/:day'=>'News/read', // 静态地址和动态地址结合'
:user/:blog_id' =>'Blog/read',// 全动态地址
数字约束
支持对变量的类型检测,但仅仅支持数字类型的约束定义,例如
'blog/:id\d'=>'Blog/read',
函数支持
可以支持对路由变量的函数过滤,例如:'blog/:id\d|md5'=>'Blog/read',
表示对匹配到的id变量进行md5处理,也就是说,实际传入read操作方法的$_GET['id']
其实是md5($_GET['id'])。
可选定义
支持对路由参数的可选定义,例如:
'blog/:year\d/[:month\d]'=>'Blog/archive',
[:month\d]
变量用[ ]包含起来后就表示该变量是路由匹配的可选变量。
完全匹配
规则匹配检测的时候只是对URL从头开始匹配,只要URL地址包含了定义的路由规则就会匹配成功,如果希望完全匹配,可以使用$符号,例如:
'new/:cate$'=> 'News/category'
-
正则路由表达式
正则定义必须以“/”开头,否则就视为规则表达式。
'/^new\/(\d{4})\/(\d{2})$/' => 'News/achive?year=:1&month=:2',
正则定义也支持函数过滤处理,例如:
'/^new\/(\d{4})\/(\d{2})$/' => 'News/achive?year=:1|format_year&month=:2',
其中 year=:1|format_year 就表示对匹配到的变量进行format_year函数处理(假设format_year是一个用户自定义函数)。
静态路由
静态路由定义中不包含动态参数,静态路由不需要遍历路由规则而是直接定位,因此效率较高,但作用也有限。
静态路由的路由地址 只支持字符串,格式:[控制器/操作?]参数1=值1&参数2=值2。
'URL_MAP_RULES'=>array( 'new/top' => 'news/index?type=top')
闭包支持
'URL_ROUTE_RULES'=>array( 'hello/:name' => function($name){ echo 'Hello,'.$name; })
继续执行
默认的情况下,使用闭包定义路由的话,一旦匹配到路由规则,执行完闭包方法之后,就会中止后续执行。如果希望闭包函数执行后,后续的程序继续执行,可以在闭包函数中使用布尔类型的返回值,例如:
'hello/:name' => function($name){
echo 'Hello,'.$name.'
';
$_SERVER['PATH_INFO'] = 'blog/read/name/'.$name;
return false; } //返回false则可继续执行 blog控制器中的read方法
路由地址
路由地址(可以支持传入额外参数)表示前面的路由表达式需要路由到的地址(包括内部地址和外部地址),并且允许隐式传入URL里面没有的一些参数,这里允许使用字符串或者数组方式定义,特殊情况下还可以采用闭包函数定义路由功能。
支持下面6种方式定义:
定义方式 定义格式
方式1:路由到内部地址(字符串) '[控制器/操作]?额外参数1=值1&额外参数2=值2...'
方式2:路由到内部地址(数组)参数采用字符串方式 array('[控制器/操作]','额外参数1=值1&额外参数2=值2...')
方式3:路由到内部地址(数组)参数采用数组方式 array('[控制器/操作]',array('额外参数1'=>'值1','额外参数2'=>'值2'...)[,路由参数])
方式4:路由到外部地址(字符串)301重定向 '外部地址'
方式5:路由到外部地址(数组)可以指定重定向代码 array('外部地址','重定向代码'[,路由参数])
方式6:闭包函数 function($name){ echo 'Hello,'.$name;}
路由地址参数
路由参数
当路由地址采用数组方式定义的时候,还可以传入额外的路由参数。
这些参数的作用是限制前面定义的路由规则的生效条件。
限制URL后缀
例如:
'blog/:id'=>array('blog/read','status=1&app_id=5',array('ext'=>'html')),
就可以限制html后缀访问该路由规则才能生效。
限制请求类型
例如:
'blog/:id'=>array('blog/read','status=1&app_id=5',array('method'=>'get')),
就限制了只有GET请求该路由规则才能生效。
自定义检测
支持自定义检测,例如: 例如:
'blog/:id'=>array('blog/read','status=1&app_id=5',array('callback'=>'checkFun')),
就可以自定义checkFun函数来检测是否生效,如果函数返回false则表示不生效。