ThinkPHP3.2.3路由规则的定义格式为: '路由表达式'=>'路由地址和传入参数'
或者:array('路由表达式','路由地址','传入参数')
模块路由和全局路由配置的区别在于,全局路由的路由地址必须包含模块。
路由表达式
路由表达式包括规则路由和正则路由的定义表达式,只能使用字符串。
表达式 | 示例 |
---|---|
正则表达式 | /^blog/(\d+)$/ |
规则表达式 | blog/:id |
详细的规则路由和正则路由表达式的定义方法参考后面的章节。
路由地址
路由地址(可以支持传入额外参数)表示前面的路由表达式需要路由到的地址(包括内部地址和外部地址),并且允许隐式传入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;} |
如果你定义的是全局路由(在公共模块的配置文件中定义),那么路由地址的定义格式中需要增加模块名,例如:
'blog/:id'=>'Home/blog/read' // 表示路由到Home模块的blog控制器的read操作方法
如果路由地址以“/”或者“http”开头则会认为是一个重定向地址或者外部地址,例如:
'blog/:id'=>'/blog/read/id/:1'
和
'blog/:id'=>'blog/read'
虽然都是路由到同一个地址,但是前者采用的是301重定向的方式路由跳转,这种方式的好处是URL可以比较随意(包括可以在URL里面传入更多的非标准格式的参数),而后者只是支持模块和操作地址。
举个例子,如果我们希望 avatar/123
重定向到 /member/avatar/id/123_small
的话,只能使用:
'avatar/:id'=>'/member/avatar/id/:1_small'
路由地址采用重定向地址的话,如果要引用动态变量,也是采用 :1、:2
的方式。
采用重定向到外部地址通常对网站改版后的URL迁移过程非常有用,例如:
'blog/:id'=>'http://blog.thinkphp.cn/read/:1'
表示当前网站(可能是http://thinkphp.cn)的 blog/123
地址会直接重定向到 http://blog.thinkphp.cn/read/123
。
默认情况下,外部地址的重定向采用301重定向,如果希望采用其它的,可以使用:
'blog/:id'=>array('http://blog.thinkphp.cn/read/:1',302);
在路由跳转的时候支持额外传入参数对(额外参数指的是不在URL里面的参数,隐式传入需要的操作中,有时候能够起到一定的安全防护作用,后面我们会提到),支持 额外参数1=值1&额外参数2=值2
或者 array('额外参数1'=>'值1','额外参数2'=>'值2'...)
这样的写法,可以参考不同的定义方式选择。例如:
'blog/:id'=>'blog/read?status=1&app_id=5', 'blog/:id'=>array('blog/read?status=1&app_id=5'), 'blog/:id'=>array('blog/read','status=1&app_id=5'), 'blog/:id'=>array('blog/read',array('status'=>1,'app_id'=>5)),
上面的路由规则定义中额外参数的传值方式都是等效的。status
和app_id
参数都是URL里面不存在的,属于隐式传值,当然并不一定需要用到,只是在需要的时候可以使用。