think php静态路由,ThinkPHP笔记-路由

路由

利用路由功能,可以让你的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则表示不生效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值