QeePHP 的 URL 路由解析与生成

2010年05月23日 分类: 2 条评论


QeePHP 是一个快速、灵活的开发框架。应用各种成熟的架构模式和创新的设计,帮助开发者提高开发效率、降低开发难度。它的路由功能,简单来说就是 URL 重写。

比如最初的地址是: http://xxx.com/index.php?cont … on=show&name=aaa
经过优化后就是:http://xxx.com/projects/aaa
第二个地址相比第一个,不但更短,而且更有意义。也更容易被人记忆,当然对于搜索引擎来说也很友好。

过去要实现这样的功能,要做几件事:
1、修改服务器设置,启用 URL 重写功能,例如 Apache 的 mod_rewrite
2、为网站添加重写规则,每一个要重写的 URL 都得添加一次规则
3、在应用程序中编写一个生成 URL 的助手类,并根据一个规则表来生成优化后的网址

麻烦的事情就是如果要调整一下 URL 的结构或者新增一些规则,就得改同时修改网站的重写规则配置文件、助手类。如果要重写的网址数量一多,维护起来就非常不方便了。要是换个运行环境,说不定还不支持 rewrite,或者需要修改所有的重写规则(例如 lighttpd 的规则就和 apache 不同)。

为了解决这个问题,各种新一代的框架都提供了 URL 的路由功能。

URL 路由功能分为两部分:
1、URL 地址的解析
2、URL 地址的生成

URL 地址的解析

URL 解析是把诸如 http://xxx.com/projects/aaa 这样的地址解析为应用程序需要的参数,这样框架才能知道应该调用哪一个控制器来完成这个请求,并且把参数传递给控制器。

http://xxx.com/projects/aaa 这个地址在 xxx.com 上解析后就是:

控制器: projects
动 作: show
参 数: name=aaa

这样一来在 projects 控制器的 show 动作方法中就可以通过 name 参数判断用户是要查看哪一个开源项目的信息了。

为了能够解析 http://xxx.com/projects/aaa 这样的地址,我们需要在配置文件中添加一条规则:
projects_show:
pattern: “/projects/:name”
defaults:
controller: “projects”
action: “show”
config:
name: “[a-z0-9-_]+”

projects_show 是这个规则的名字,而 pattern 是规则匹配模式。匹配模式中的 :name 则是一个变量,而该变量通过 config 选项指定了比对规则为“[a-z0-9-_]+”(name 参数的值只能是字母、数字下划线和横线)。

经过这样设置后,http://xxx.com/projects/aaa 这样的 URL 就能被正确解析了。

相对于在服务器配置文件中写重写规则,URL 路由提供的规则有几个好处:
1、不需要修改服务器设置的权限,我们只需要修改应用程序的配置文件
2、修改应用程序的设置就可以配置 URL 重写,因此不需要重新启动 Web Server 软件
3、比 Web Server 的重写规则更简单

URL 地址的生成

解决了 URL 的解析问题,还有 URL 的生成问题。
URL 路由提供的生成功能可以根据你提供的参数,自动匹配合适的规则,然后生成最终的 URL 地址。

例如:
# 生成 /projects/aaaa
url(‘projects/show’, array(‘name’ => ‘aaa’))

假如有多条规则,QeePHP 可以自动匹配出最合适那一条,然后生成对应的 URL 地址。

这种能力带来了下列好处:
1、我们再也不需要维护两个规则表了(一个用于解析,一个用于生成),一个规则表就搞定了一切
2、只需要修改规则表,就可以获得不同的 URL 地址,而不需要修改模板、程序中生成 url 的代码
3、只需要修改应用程序的设置,就可以让应用程序工作在不同的服务器环境中,适应各种情况

例如把前面的规则改为:
projects_show:
regex: ‘/project-([a-z0-9-_]+).html’
defaults:
controller: “projects”
action: “show”
config:
name: 1
生成的 URL 地址就会自动变成: http://xxx.com/project-aaa.html 这样的。
这种灵活性可以为网站的用户体验、SEO 带来很多便利。

而这些修改和变化,完全不需要我们修改应用程序中的代码和模板代码,唯一需要改动的就是路有规则表。

2 条评论

发表评论

  1. 减肥药  2010-05-24 16:01 #comment-1490

    精彩,抢个沙发坐坐

    • Mars  2010-05-27 00:02 #comment-1499

      @减肥药 总结一些日常接触到的知识点,做个记录。

发表评论