Url控制php类,thinkphp的url控制之路由系统

thinkphp的url控制之路由系统

发布时间:2020-03-26 15:41

ThinkPHP支持URL路由功能,要启用路由功能,需要设置URL_ROUTER_ON参数为true。开启路由功能后,系统会自动进行路由检测,如果在路由定义里面找到和当前URL匹配的路由名称,就会进行路由解析和重定向。路由功能需要定义路由定义文件,位于项目的配置目录下面,文件名为routes.php,

定义格式:

说明:routes.php文件在扩展配置里定义'APP_CONFIG_LIST'=>array('taglibs','routes','htmls','modules','actions','tags'),对于已经定义好的扩展配置文件系统会自动导入,并加入项目配置的缓存文件里面。

例如:路由配置文件routes.php的定义会自动并入:returnarray(//第一种方式常规路由'RouteName'=>array('模块名称','操作名称','参数定义','额外参数'),//第二种方式泛路由'RouteName@'=>array(array('路由匹配正则','模块名称','操作名称','参数定义','额外参数'),),…更多的路由名称定义)系统在执行Dispatch解析的时候,会判断当前URL是否存在定义的路由名称,如果有就会按照定义的路由规则来进行URL解析。例如,我们启用了路由功能,并且定义了下面的一个路由规则:

'blog'=>array('Blog','archive','year,month,day','userId=1&status=1')那么我们在执行http:///appName/blog/2009/10/1/的时候就会实际执行Blog模块的archive操作,后面的参数/2009/10/1/就会依次按照year/month/day来解析,并且会隐含传入userId=1和status=1

两个参数。

另外一种路由参数的传入是http:///appName/?r=blog&year=2009&month=10&day=1

,会执行上面相同的路由解析,该方式主要是提供不支持PATHINFO方式下面的兼容实现。其中r由VAR_ROUTER参数定义,默认是r。如果需要路由到分组模块的话,可以定义成

'blog'=>array('Home.Blog','archive','year,month,day','userId=1&status=1')

就可以指定路由到Home分组的Blog模块。泛路由支持泛路由指的是对同一个路由名称提供了多个规则的支持,使得URL的设置更加灵活,例如,我们对Blog路由名称需要有多个规则的路由:

'Blog@'=>array(array('/^/(d+)(/p/d)?$/','Blog','read','id'),array('/^/(d+)/(d+)/','Blog','archive','year,month'),),

第一个路由规则表示解析Blog/123这样的URL到Blog模块的read操作第二个路由规则表示解析Blog/2009/10这样的URL到Blog模块的archive操作泛路由的定义难度就在路由正则的定义上面,其它参数和常规路由的使用一致。说明:正则表达式用来匹配参数举个简单路由的例子,如果我们有一个City模块,而我们希望能够通过类似下面这样的URL地址来访问具体某个城市的操作:

http:///index.php/City/shanghai/shanghai

这个操作方法是不存在的,我们给相关的城市操作定义了一个city方法,如下:

ClassCityActionextendsAction{publicfunctioncity(){

//读取城市名称$cityName=$_GET['name'];Echo('当前城市:'.$cityName);

}

}

接下来我们来定义路由文件,实现类似于

http:///index.php/City/shanghai/

这样的解析,路由文件名称是

returnarray('City'=>array('City','city','name'););

这样,URL里面所有的City模块都会被路由到City模块的city操作,而后面的第二个参数会被解析成$_GET['name']接下来,我们就可以在浏览器里面输入http:///index.php/City/beijing/http:///index.php/City/shanghai/http:///index.php/City/shenzhen/会看到依次输出的结果是:当前城市:beijing当前城市:shanghai当前城市:shenzhen

URL生成

为了配合所使用的URL模式,我们需要能够动态的根据当前的URL设置生成对应的URL地址,为此,ThinkPHP内置提供了U方法,用于URL的动态生成,可以确保项目在移植过程中不受环境的影响。U方法的定义规则如下(方括号内参数根据实际应用决定):

U('[项目://][路由@][分组名-模块/]操作?参数1=值1[&参数N=值N]')或者用数组的方式传入参数U('[项目://][路由@][分组名-模块/]操作',array('参数1'=>'值1'[,'参数N'=>'值N']))如果不定义项目和模块的话就表示当前项目和模块名称,下面是一些简单的例子:

U('Myapp://User/add')//生成Myapp项目的User模块的add操作的URL地址U('Blog/read?id=1')//生成Blog模块的read操作并且id为1的URL地址U('Admin-User/select')//生成Admin分组的User模块的select操作的URL地址参数请确保使用?id=1&name=tp或者数组的方式来定义,虽然有些情况下U('Blog/read/id/1')和U('Blog/read?id=1')的效果一样,但是在不同的URL设置情况下,会导致解析的错误。根据项目的不同URL设置,同样的U方法调用可以智能地对应产生不同的URL地址效果,例如针对U('Blog/read?id=1')这个定义为例。如果当前URL设置为普通模式的话,最后生成的URL地址是:

http:///index.php?m=Blog&a=read&id=1

如果当前URL设置为PATHINFO模式的话,同样的方法最后生成的URL地址是:

http:///index.php/Blog/read/id/1

如果当前URL设置为REWRITE模式的话,同样的方法最后生成的URL地址是:http:///Blog/read/id/1如果当前URL设置为REWRITE模式,并且设置了伪静态后缀为.html的话,同样的方法最后生成的URL地址是:

http:///Blog/read/id/1.html

U方法还可以支持路由,如果我们定义了一个名称为View的路由,指向Blog模块的read操作,参数是id,那么U('View@?id=1')生成的URL地址是:

http:///index.php/View/id/1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值