仗剑江湖载酒行

为什么自动映射路由不可取

2020.05.21

在很多地方看到人们抱怨Laravel或者Symfony一类的框架定义路由麻烦;根据我的观察,这好像是PHP特有的一个现象。

诚然,PHP没有像Java注解或Python装饰器一类的特性(至于用PHP注释去模拟的注解,我始终觉得透着一股邪性)让人很方便地去定义路由,但这种显式地绑定路由和方法我也没有觉得有多麻烦。

在较早的php原生开发的时期,人们直接去访问php或者静态文件;后来有了 Codeigniter 一类的MVC框架。这类框架带来了一种设计在PHP圈影响深远,即URLpath部分由控制器名/方法名自动映射而来。如:

class DemoController {
    public function indexAction()
    {
        ...
    }
}

上面这段代码所映射成路由就会是这样:“http://host/demo/index”。这好像让部分PHPer形成了一个"路由本来就该是这样的"的认知,对于这种认知我个人有不同的看法。

我们先来认真了解一下,什么是URL? URL 即 Uniform Resource Locator,统一资源定位符。从维基百科上它的定义看来,它的完整格式是这样的:

[协议类型]://[访问资源需要的凭证信息]@[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]

其中和路由相关的path的定义是”资源层级UNIX文件路径“,它和”路由器/方法“的映射是没有直接关系的。尽管现在对”计算机资源“的定义已经十分宽泛,但从实体关系上来说,”路由器+方法“自动映射的方式是不能完整描述文件路径的,这是其一。

其次,随着像RESTful一类架构风格的出现,”路由器+方法“自动映射的方式,恐怕也很难实现RESTful风格的路由。

再次,”路由器+方法“自动映射两级的路径,就算再加上模块划分也只有三级的路径,在语义上是很呆板的,无法描述稍微复杂的语义。