首页 理论教育URL路由能够实现高度可定制的URL形式

URL路由能够实现高度可定制的URL形式

【摘要】:使用MVC的好处之一就是能够提供可定制化的URL形式,其中路由功能是MVC框架中最常见的功能。ThinkPHP提供了完善的URL路由功能,能够实现高度可定制的URL形式。在ThinkPHP 3.0中,URL路由规则使用URL_ROUTE_RULES数组进行配置;而在ThinkPHP 2.x中使用的是routes.php配置文件,这点需要注意。使用Web服务器URL重写大多数都是使用正则来实现路由功能的。

使用MVC的好处之一就是能够提供可定制化的URL形式,其中路由功能是MVC框架中最常见的功能。ThinkPHP提供了完善的URL路由功能,能够实现高度可定制的URL形式。在ThinkPHP 3.0中,URL路由规则使用URL_ROUTE_RULES数组进行配置;而在ThinkPHP 2.x中使用的是routes.php配置文件,这点需要注意。下面为了便于讲解,将以URL“http://tp.localhost/index.php/t/李开涌”路由到“http://tp.localhost/index.php?a=content&m=index&name=李开涌&email=kf@86055.com”为示例,详细介绍ThinkPHP提供的几种路由规则形式(所有路由规则都是基于项目不分组的,即多入口文件模式)。

1.键对值形式

格式:'路由规则'=>'[模块/操作]?额外参数1=值1&额外参数2=值2...'

键值对形式的路由规则容量比较小,它是以关联数据作为配置规则。其中t/:name表示路由规则,路由规则决定了URL表现的形式;Index/content表示路由的目标,Index表示控制器名称,content表示控制器动作,顺序不能相反。t后的分隔符“/”表示一个路由匹配的结束,它与Index/content进行呼应。

2.键对数组形式

格式:'路由规则'=>array('[模块/操作]','额外参数1=值1&额外参数2=值2...')

键对数组形式和键对值形式是类似的,不同的是路由目标的形式使用的一个关联数组。可见,键对数组形式无论是格式上还是容量上都比单一的键对值形式要灵活。

3.跳转形式

格式:'路由规则'=>'外部地址'

跳转形式的路由规则形式就是一个页面跳转,在实际应用开发中的意义不大。外部地址是一个字符串,可以是任何有效的URL地址。

4.重定向跳转

格式:'路由规则'=>array('外部地址','重定向代码')(www.chuimin.cn)

重定向跳转是普通跳转模式的增强模式,它在跳转到外(内)部地址时还会向浏览器头部(header)输出额外信息。例如索引擎对于普通的跳转是不会索引的,但在跳转时给浏览器的头部附加上“HTTP/1.1301 Moved Permanently”信息,此时搜索引擎就认为该链接是一条正常的数据链接,会按正常的程序进行索引。常用的浏览器头部信息有301、302等。

上述4种路由形式中,主要使用的是第1和第2种。这里还需要深入理解路由规则,所谓的路由规则就是与浏览器相配对的参数,在浏览器中呈现的参数可以有若干个,但一条路由规则只对应一个参数。

在没有使用路由之前的传统MVC控制流程中,无论哪种URL模式都必须要显式地给出控制器名称和动作名称(index除外,PATHINFO使用参数位置表示)。但使用URL路由之后,控制器和控制器动作都可以取消了,开发人员可以使用任何一个字符(包括中文)代替控制器和动作名称,这在主流的大型网站中是非常多见的,例如新浪微博、facebook等。

URL路由并不一定需要MVC框架才能实现,事实上使用普通的PHP来做URL路由在超大并发的环境下也不是很理想。URL路由完全可以使用Web服务器的重写功能来实现,但无论是复杂度还是灵活性都不是一般的PHP程序员所能接受的,ThinkPHP提供的路由处理机制简化了路由配置流程,降低了门槛,使得网站应用开发人员更专注于业务逻辑。

现在再回过头来看前面的路由规则形式。“t/:name”是一种动态写法,“:”表示的是一个可接收的变量,如果不使用“:”则不是变量,而是一个固定的字符串;“name”表示变量名称,它与URL字符串“t/”后面的参数进行配对。变量是可以加限制符的,限制符以正则表示式中的匹配符号作为条件,例如限制变量name只能接收纯数字,代码如下。

加入限制符以后,在content动作中使用$_G[“name”]进行接收,就再也获取不到传参值了,因为“李开涌”并非为数字。读者可以尝试改成数字进行验证。

路由规则不仅能够使用限制字符,还能够使用排除字符。同样,排除字符使用“^”符号进行定义,多个排除字符使用“|”隔开,如以下代码所示。

如上述代码所示,使用排除字符之后,在浏览器中输入“t/add”、“edit”、“delete”字符都将被过滤,在content动作中将不能接收到这些参数值。

在以上几个示例中,路由名称“t”都是固定的,它必须要与浏览器地址中的t进行对应。使用Web服务器URL重写大多数都是使用正则来实现路由功能的。同样,在ThinkPHP中路由名称也是支持正则匹配的,使用正则匹配后显得更加灵活,只要URL请求字符串符合定义的正则,ThinkPHP就可以将相应的地址路由到目标地址中,如以下代码所示。

使用正则后,控制器、动作、参数都可以在一条正则中进行配对。使用正则表达式,可以实现任何形式的URL,它的灵活性是最高的,但需要读者额外熟悉正则表达式(正则表达式并非PHP特有的功能,它是一套规范,在JavaScript等许多脚本中应用得很广泛,MVC框架本身就是利用了大量正则来进行MVC控制的)。