ThinkPHP框架对URL有一定的规范,所以如果你希望定制你的URL格式的话,就需要好好了解下内置的路由功能了,它能让你的URL变得更简洁和有文化。
启用路由
要使用路由功能,前提是你的URL支持PATH_INFO,并且在项目配置文件中开启路由:
'URL_ROUTER_ON'&">nbsp; => 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', ),
系统会按定义的顺序依次匹配路由规则,一旦匹配到的话,就会定位到路由定义中的模块(支持分组)和操作方法去执行,并且后面的规则不会继续匹配。
路由定义
路由规则的定义方式如下:
'路由表达式'=>'路由地址和额外参数'
路由表达式
路由表达式包括规则路由和正则路由的定义表达式,只能使用字符串。
表达式 示例 正则表达式 /^blog\/(\d+)$/ 规则表达式 blog/:id
正则表达式
路由表达式支持的正则定义必须以“/”开头,否则就视为规则表达式。也就是说如果采用
'#^blog\/(\d+)$#'
方式定义的正则表达式不会被支持,而会被认为是规则表达式进行解析,从而无法正确匹配。
'/^new\/(\d{4})\/(\d{2})$/' => 'News/achive?year=:1&month=:2',
对于正则表达式中的每个变量(即正则规则中的子模式)部分,如果需要在后面的路由地址中引用,可以采用:1、:2这样的方式,序号就是子模式的序号。
更多的关于如何定义正则表达式就不在本文的描述范畴了。
规则表达式
3.0的规则路由是从2.1的简单路由进化而来,虽然无法完美实现正则路由的功能,但是相比简单路由确实增强了不少,而且比正则路由更方便定义和容易理解。
规则表达式通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式:
'my'=>'Member/myinfo', // 静态地址路由 类似于之前版本的简单路由 'blog/:id'=>'Blog/read', // 静态地址和动态地址结合 'new/:year/:month/:day'=>'News/read', // 静态地址和动态地址结合 ':user/:blog_id'=>'Blog/read',// 全动态地址
规则表达式的定义以“/”为参数分割符(无论你的URL_PATHINFO_DEPR设置是什么,请确保在定义规则表达式的时候统一使用“/”进行URL参数分割)。
每个参数中以“:”开头的参数都表示动态参数,并且会自动对应一个GET参数,例如:id表示该处匹配到的参数可以使用$_GET['id']方式获取,:year :month :day 则分别对应$_GET['year'] $_GET['month'] $_GET['day']。
数字约束
支持对变量的类型检测,但仅仅支持数字类型的约束定义,例如
'blog/:id\d'=>'Blog/read',
表示只会匹配数字参数,如果你需要更加多的变量类型检测,请使用正则表达式定义来解决。
规则排除
非数字变量支持简单的排除功能,主要是起到避免解析混淆的作用,例如:
'news/:cate^add|edit|delete'=>'News/category'
因为规则定义的局限性,恰巧我们的路由规则里面的news和实际的news模块是相同的命名,而:cate并不能自动区分当前URL里面的动态参数是实际的操作名还是路由变量,所以为了避免混淆,我们需要对路由变量cate进行一些排除以帮助我们进行更精确的路由匹配,格式^add|edit|delete表示,匹配除了add edit 和delete之外的所有字符串,我们建议更好的方式还是改进你的路由规则,避免路由规则和模块同名的情况存在,例如
'new/:cate'=>'News/category'
就可以更简单的定义路由规则了。