第二话:URL路由
URL路由功能确实是新版的一个重要特性,虽然实现只是加了不到50行代码,但是影响确实深远的,意义是重大的。
最传统的URL模式显然是
?m=module&a=action&id=1 这样,这样的模式在
ThinkPHP中称为URL_COMMON 普通模式。
ThinkPHP在创立的时候就提供了对PATHINFO的充分支持,也就是现在的URL_PATHINFO模式。最早的URL模式 是把传统的
?m=module&a=action转换成
/m/module/a/action/id/1 这个在现在来说已经显得很幼稚和麻烦,但是在一年前的Dispatcher就是这样设计的,进而,ThinkPHP还对这个URL作了另外一个改进,就是可以转换为
/m,module/a,action/id,1/ 或者
/m,module,a,action,id,1/ 这样的URL
直到后来才最终简化为
/module/action/id/1 这样的形式,现在这个URL形式也是大多数基于action的
框架的主要形式。
因此上面的三种PATHINFO模式在ThinkPHP中可以作为URL_PATHINFO 的三种子模式来使用,也现在现在仍然保留的PATH_MODEL参数,默认是第三种模式,也就是现在普通采用的 /module/action/id/1。
随后,ThinkPHP仍然发现这个URL并具体更多的灵活性,于是想到了URL_REWRITE,当然这种模式需要
服务器的REWRITE的支持,URL_REWRITE的另外一个好处就是可以隐藏入口
文件在URL里面的显示。
虽然URL_REWRITE的功能非常强大,但是对于初级用户来说很难胜任,其实我也不太了解。而且REWRITE模式框架需要做的东西不多,更关键还是要针对
应用来设计不同的URL模式,也就是说要根据
项目设置不同的REWRITE规则。于是,就需要有种
软件的解决方案来模拟URL_REWRITE的某些效果。于是,这个新的重担就挑在了新版的ThinkPHP身上了。经过一些考虑之后,我引入了新的URL路由机制,也就是URL_ROUTER模式的支持。
路由模式需要给每个项目
定义路由规则,相当于REWRITE模式下面给不同的应用定义REWRITE规则一样。
路由规则的定义很简单,例如:
- return Array(
- array(
'art'=>array('art','read','id')),- array(
'blog'=>array('blog','index','year,month,date')),- )
经过定义上面的路由规则后,我们来访问下面的两个URL
就分别路由到了art模块的read操作,后面的参数表示id 和 blog模块的index操作,后面的参数依次表示年、月、日。
而且路由定义还支持隐含的默认参数,例如:
- array('blog'=>array('blog','index','year,month,date','p=3&class=1'))
可以表示默认为类型为1的第三页。对于路由模式,URL里面的get方式是不会解析成路由规则的部分的,但是有个特殊情况可以切换路由,就是通过使用路由
变量(由VAR_ROUTER定义)r
例如
/art/123?r=blog 其实使用的是blog路由,除了VAR_ROUTER变量之外的get参数,不作为路由规则来解析,而是作为辅助参数来解析,例如:
如此一来本来要服务器支持的URL REWRITE特性可以方便的通过路由功能来定义和使用了。每个应用项目根据自己的设计来定义路由规则就行了。对应用的开发模式没有任何影响。
另外,如果定义的路由不存在,
系统会自动判断模块和操作来执行。
以上就是新版的URL路由功能和历史渊源,呵呵~今夜到此结束。欢迎留言~
[
本帖最后由 Ru.rpg 于 2007-7-6 18:10 编辑 ]