Category Archives: Suara

PHP Routing Part 2:Router

上次讲完Request之后,一直在研究Router(路由器)部分的东东。看过PHP、Python等其他框架内实现的路由器。

路由一共分为两个功能:
1、标准路由器, 这里会把链接上的uri根据配置文件分析后,得到Controller和Action。
2、跳转路由和代理路由, 也就是redirect和proxy。同样和1一样,需要写入uri的配置规则,只不过是会根据配置跳转链接,并且赋予301或者302状态码。

在PHP5.4开始的版本,基本上都是使用PHP-FPM模式,当用户访问一个页面,webserver(比如Nginx),会将请求传给php,此时PHP会进行初始化,这时候会将一些变量常量写入到了$_SERVER中。就如上面所说,每次请求都是一个完整的链接,我们分割为3个部分:基本地址,路径,请求参数。

  1. 基本地址: 也就是你的基础路径,可以是一个域名也可以是一个带有path的地址链接。这些将会忽略不计。
  2. 路径: 这里的路径就是你所需的有效路径,比如 /users/show, /video/categories, /news/content/2014-03-02/1313.html
  3. 请求参数: 这里包含了_COOKIE,_GET,_POST以及php://input

一般情况下,我们需要的是路径这一部分,一般可以通过REQUEST_URI获得。这些都是在Request类中的,还没开始进入的Router类中哦,接下来,是路径解析。首先来说说一说标准路由,首先你要对你的期望制定一些路由规则。在路由器中以:开头的,紧跟着的就是变量名称,例如 /:controller/:action 。那么所有在:controller位置的变量都会当作controller名来处理。一般来说我们链接有以下几种需求:
1. 根目录形式 / 需要定义controller和action,指定首页所显示的内容
2. /:controller/:action/* 最常见的链接模型
3. /api/:contoller/:action 链接是有一个prefix的。
4. /news/content/:date/:id.html 一种伪静态的链接。 像这种:date :id是一种自定参数,我们可以在路由配置后面加上 date 的匹配规则, [0-9]{4}-[0-9]{2}-[0-9]{2}。

上面4个例子都是我们常看到的,这些配置有了,还不能正常使用。我们需要通过将这些配置转换成程序可读的正则表达式。首先我们将:controller分割出来,controller将会用于匹配后的key名。这时候正则表达式需要利用标签格式(?exp),这个模式在匹配成功后,返回的结果中,将会以你定的name来做为key,就不需要通过数据索引来一一访问。在匹配成功之后,有了controller和action,这时候Dispatcher就会正式调用。

至此,路由解析已经完成,所有的处理已经全部交给了Controller。Controller处理完结果之后,将会输出给Response,显示给用户的面前。