一开始动手写博客的时候,我其实根本没考虑过设计好架构。
直到我看到了一大堆的Include和Require,堪比数学难题还棘手的时候。
阶段一:IF?ELSE.
我其实动手用php写博客是很早之前的事情了,大概是一两年前,那时候是受了xiobb自写博客的启发。
说真的,我真不太愿意提起那段时间写的代码,具体表现如下:
- 无尽的If elseif else地狱
- 难以理喻的目录结构
- 到底在引用什么css……
我只有一个目标:让用户在访问url的时候,能把内容输出出来就行。
具体的代码都存在我那台老台式的机械硬盘上,现在再大费周章翻出来给大家看恐怕是不太可能了。
我那时甚至连router是什么都不知道。我只会if else。
$dir = $_GET['page'];
if($dir == 'xxx'){
require_once('...');
}elseif{
...
}else{
...404
}
复现大概如此。
页面之间互相require,文件头部的include满天飞,用的还都是相对路径。我真不知道我是这么在文件地狱里面一个个为引用指路的。
您猜怎么着?文章存储在txt文档,甚至得用html写好,而不是优雅地处理markdown文件。
最后,我看到那入口文件一坨屎的时候,我已经不敢动项目了。
阶段2:Typescript?YES!
嗯,虽然和标题关系可能有点远,但是,这是我唯一一次的成功。
受群友yzcf的启发,我去学了Typescript,发现和PHP有点像,索性用ts尝试开发博客。
https://github.com/mvocp/PersonalSite
这个阶段距离首次尝试开发也有很长一段时间的距离。
文章显示逻辑处理方面,由于没有使用mysql这么方便的东西,我只好用github静态存储文章,通过markdown解析器解析出html输出。
那么问题来了,我们要考虑长远,因此需要考虑文章太多对性能的影响。显然有个索引是最好的解决方法,可我懒得去一个个添加索引呢,于是我就使用了Github Action在每次对文章仓库Git Push的时候生成索引。反正Action的服务器配置很劲爆。
具体存储在这里:https://github.com/mvocp/blog-posts
next.js确实是一个优秀的框架,但是,对于一个小博客来说,体积貌似还是有点太大了。
阶段3:Using MVC.
MVC模式。

MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
MVC模式最早由Trygve Reenskaug在1978年提出[1],是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件架构。MVC模式的目的是实现> 一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式透过对复杂度的简化,使程序结构更加直观。软件系统过
对自身基本部分分离的同时也赋予了各个基本部分应有的功能。专业人员可以依据自身的专长分组:
模型(Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。
视图(View) - 界面设计人员进行图形界面设计。
控制器(Controller)- 负责转发请求,对请求进行处理
——维基百科
这太伟大了。
MVC可以将各个功能分离,让项目变得更加容易维护,这也正是我需要的。
第一次认识MVC模式是在读一本ThinkPHP的入门书籍的时候,我深深地被其魅力吸引,于是想尝试使用其开发。
很快,我意识到了,ThinkPHP是适合中大型项目使用的框架,对于一个博客来说太大材小用。
于是我将目光转向CodeIgniter。

这也是我选择使用CI的原因。
很快,第一个作品就被生产出来:

由于我把页面输出逻辑写的太死,导致我想优化的时候发现无从下手。
- 新增一个页面,我需要添加多个文件
- SEO优化如同地狱一般难搞
- 404逻辑都处理不对
还是如同地狱一般,况且不只是我写得烂,是用这种方式迟早会烂。
阶段4:Why not?
我需要一个真正的路由。
我需要让它能尽可能优雅地处理请求。
我需要它尽可能方便维护。
我需要让它最小化。
我必须否定“我要上大框架”用的错觉。
阶段5:Did it.
我的设计原则:
- 所有入口只有一个(index.php)
- URL 只解析一次
- 页面文件不再互相 require
- 路由表是“可读的结构”,不是 if/else
简单用伪代码叙述就是:
- 解析 path
- match 规则
- dispatch 到 handler
也许,我需要自建一个虽然不是那么聪明,但是极易维护和重构的框架。
我不需要中间件、依赖注入、各种奇怪的小魔法。博客不是商业项目。

我做到了。
我简单的设计了一个view.php用来render,一个不到100行的router来解决基本请求问题,同时在输出文章的时候通过控制器来自动优化SEO。
代码文件总体积也是从惊人的48M降低到了就比typecho大一点的0.9M。
-
尾声
手写一次,比看10篇教程有用。
架构不是一开始设计出来的,而是问题逼出来的。