在很多地方看到人们抱怨Laravel
或者Symfony
一类的框架定义路由麻烦;根据我的观察,这好像是PHP
特有的一个现象。
诚然,PHP
没有像Java
注解或Python
装饰器一类的特性(至于用PHP
注释去模拟的注解,我始终觉得透着一股邪性)让人很方便地去定义路由,但这种显式地绑定路由和方法我也没有觉得有多麻烦。
在较早的php原生开发的时期,人们直接去访问php或者静态文件;后来有了 Codeigniter 一类的MVC
框架。这类框架带来了一种设计在PHP
圈影响深远,即URL
的path
部分由控制器名/方法名
自动映射而来。如:
class DemoController {
public function indexAction()
{
...
}
}
上面这段代码所映射成路由就会是这样:“http://host/demo/index”。这好像让部分PHPer
形成了一个"路由本来就该是这样的"的认知,对于这种认知我个人有不同的看法。
我们先来认真了解一下,什么是URL
?
URL
即 Uniform Resource Locator,统一资源定位符。从维基百科上它的定义看来,它的完整格式是这样的:
[协议类型]://[访问资源需要的凭证信息]@[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]
其中和路由相关的path
的定义是”资源层级UNIX文件路径“,它和”路由器/方法“的映射是没有直接关系的。尽管现在对”计算机资源“的定义已经十分宽泛,但从实体关系上来说,”路由器+方法“自动映射的方式是不能完整描述文件路径的,这是其一。
其次,随着像RESTful
一类架构风格的出现,”路由器+方法“自动映射的方式,恐怕也很难实现RESTful
风格的路由。
再次,”路由器+方法“自动映射两级的路径,就算再加上模块划分也只有三级的路径,在语义上是很呆板的,无法描述稍微复杂的语义。