正如我们看到的,todo 应用现在产生的 URL 地址都很丑陋,既不便于记忆,也不便于被搜索引擎收录。所以我们需要对 URL 进行美化。
传统的做法是通过编写 .htaccess 这样的文件来添加大量规则实现 URL 的美化,例如 Discuz 的 .htaccess 内容:
RewriteRule ^/bbs/archiver/((fid|tid)-[\w\-]+\.html)$ /bbs/archiver/index.php?$1 [L] RewriteRule ^/bbs/forum-([0-9]+)-([0-9]+)\.html$ /bbs/forumdisplay.php?fid=$1&page=$2 [L] RewriteRule ^/bbs/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /bbs/viewthread.php?tid=$1&extra=page\%3D$3&page=$2 [L] RewriteRule ^/bbs/space-(username|uid)-(.+)\.html$ /bbs/space.php?$1=$2 [L] RewriteRule ^/bbs/tag-(.+)\.html$ /bbs/tag.php?name=$1 [L] RewriteRule ^/bbs/(.*)$ /bbs/$1 [L]
这样做的主要坏处有几个:
QeePHP 是全世界第一个实现 URL 路由完全双向解析的开发框架。
开发者利用这项独一无二的能力,完全不用在编码时考虑 URL 的美化问题。只要启用 URL 路由功能,并写好路由规则,一切就由 QeePHP 框架来完成了。
也就是说,服务器环境的变化只需要我们改一下配置文件(只改一行)就可以适应了。而在编码和创建视图时,根本不需要为不同环境下的 URL 地址问题操心。
实现这种幸福状态的关键就是 QeePHP 的 URL 路由双向解析。
通过浏览器访问诸如 http://qeephp.com/projects/qeephp 这样的 URL 时,实际访问的是 projects 控制器的 show 动作,并且附带了参数 name=qeephp。
将这样一个 URL 解析为 MVC 模式需要的控制器名和动作名参数的过程称为正向解析。这个功能在大多数框架中都具备,只是强弱问题。
在前面章节中反复出现的一个函数 url() 是专门用来自动创建 URL 地址的函数。这个函数接受两个参数:UDI 和可选参数。UDI 用一种规范的形式指定了这个 URL 将要调用的控制器、动作,而可选参数则会附加在 URL 中进行传递。
在应用程序的 URL 路由没有启动时,url() 的效果如下:
url('tasks/create') // 结果为 index.php?controller=tasks&action=create url('tasks/edit', array('task_id' => 2)) // 结果为 index.php?controller=tasks&action=edit&task_id=2
而启用 URL 路由后,url() 的效果如下:
url('tasks/create') // 结果为 /tasks/create url('tasks/edit', array('task_id' => 2)) // 结果为 /tasks/edit/2
如果我们修改了路由规则,则效果可能是:
url('tasks/create') // 结果为 /create-new-tasks url('tasks/edit', array('task_id' => 2)) // 结果为 /edit-my-task/2
也就是说 url() 函数的结果取决于应用程序的配置和路由规则。
这带来的好处包括:
从 url() 指定参数获得 URL 的过程就是“反向解析”。目前只有 QeePHP 能够做到全自动的反向解析,其他框架都需要通过在生成 URL 时指定要使用的具体路由规则,否则只能创建默认样式的 URL 地址。