开发这个皮肤站程序也有一段时间了,写篇文章稍微总结一下。挺久以前的草稿了,可能有些过时内容。


起初接触到 PHP 是在搭建博客的时候,经常因为某种需求而需要对 WordPress 做一些定制。也就是那个时候我写出了人生中 第一行 PHP 代码

当时对 PHP 也没太大感觉,因为当时也没接触过 Web 开发。真正开始使用 PHP,是萌发想做一个皮肤站的念头后。

在开发语言中,我选择了 PHP 而不是喜欢的 Python。一是因为作为模板语言的PHP天生适合写 web 项目,二也是为了能涨点姿势。

因为基础还算过得去,我也没必要去看什么 PHP 新手入门教程,上手就直接开始写了。依样画葫芦撸了个基本架构就开始写前端逻辑。

现在看来当时确实是挺蠢的,应该先把后端架构好,能跑起来了再说才对。不过人总是在跌跌碰碰中成长的,上次的 refactor 中我也确实学到了不少。

说是写前端,但到了登录的时候又重新回去打算先把后端搞好。值得庆幸的是,当时我不知道从哪里听来的 ajax,也成功的用了上去,所有的请求均在 ajax.php 中处理(虽然当时叫 check.php)

统一的入口确实方便很多。编写后台逻辑的时候,我也学到了诸如 POST GET query string 如何处理的知识。

写 ajax 文件上传的时候,遇到了 如何把 jQuery ajax 得到的数据输出到外部作用域 的问题,解决这个也使我对回调函数有了更好的理解。

但是那个时候,所有的数据库操作我都只是封装成函数放在 connect.php 中,虽然这样也未尝不可,但还是有点小难看。于是在上一次重构中,我将所有数据库操作封装为一个 Utils 静态工具类以供调用(后来又抽离出了个 Database 类,AdaptedDatabase 类继承并实现数据对接功能)。

即使这样,ajax.php 中还是有太多 login、register、upload 等逻辑了,然而将这些也封装成函数的话,每次都要把用户名传参,很烦。所以我又封装了一个 User 类,传用户名构造实例,就可以使用各种封装好了的用户操作函数了。

比如原来的 login,要组装 SQL 查询密码并比较,不仅麻烦,还有 SQL注入漏洞的风险。而现在就可以用 post 用户名实例化一个 User 类,比较 post 密码 和 user 实例的 getPasswd() 返回值就可以了。因为 PHP 有垃圾回收机制,所以开销应该不会差多少,而且看起来也比较舒服。

还有就是关于 cookie 的问题。因为我的工作目录是本地 web 环境的二级目录,而又有一个 /user 三级目录,于是就喜闻乐见的碰上了 cookie path 的坑爹问题。

现在后端已经可以完全独立工作了,通信主要都是通过 ajax.php 进行。

前端框架最开始是使用的 BootStrap,但后来考虑到也没几个页面,又换成了更轻的 Pure.css。虽然在做消息提示的时候想要是 bootstrap 就好了(扶额),有时间再用 BootStrap 写一个。嘛,v2.3 以后就改成使用 AdminLTE 框架了。

然而由于没有系统学习过前端的原因,写布局的时候浪费了很长时间(当时甚至不知道 bootstrap 的栅格系统)。后来又好好看了一遍 MDN link,学到了不少。

到这个时候,登录/注册/上传 都已经没问题了,应该要想怎样获取皮肤了。

最开始我就是将上传的文件分别重命名,存放在 /skin/cape 里,这也是早期的 UniSkinMod 所使用的方法。然而我最开始的目的就是要支持 UniSkinAPI,自然不能这样存放。

根据 API,我应该提供一个 json,其中存放了用户偏好模型和 皮肤/披风 的唯一标识符。所以我把 upload 逻辑稍微改了一下,改为取文件 hash 重命名并移至 /textures,并且新增了几个数据表字段用于存放 hash,这倒是没有什么难度。

不过输出 json 难住了我。按照这个要求,静态 json 文件肯定是不可行的,必须要动态生成。但如何访问实际上并不存在的文件呢?那就需要 rewrite 了。

接触过 WordPress,Discuz 等 PHP 程序的,肯定都知道 伪静态 规则。这次我从复制别人规则的人变成了提供规则的人,想想还有点小激动呢。

配置 rewrite 规则时所遇到的坑就按下不表了,最后终于可以把请求传给 PHP 了,然后根据 pathinfo 判断是返回 json 还是 png。

这样一来,index.php 就成为了所有请求的入口点。index.php 负责了路由分发,那么原先 index.php 的内容就得封装成模板来调用了。。

你 TM 怎么 MVC 了!

视图层肯定是要和控制器分开的,这就要个 index 控制器来控制视图呈现,user/index.php 和 admin/index.php 也可以封装成两个控制器和对应视图(后来也确实抽离出了模板。。)

于是我就发现,越写越像 MVC。。嘛,也不是说 MVC 不好,只是因为最开始接触 MVC 的时候嫌它项目结构太复杂而抱有一些成见,现在看起来也确实挺不错的。

这也是最开始我没打算用 MVC 框架的原因之一。没用过原生 PHP 开发项目,反而一开始就用框架也挺不像话的。

通过这几个周末的开发以及资料查阅,我也是对设计模式有了更深的理解,也了解了 MVC 框架的具体实现,算是收获颇丰吧~


其实也没学到啥东西,不过毕竟是初学者嘛,dalao 们见笑了

下次尝试用 Laravel 重写这个项目看看吧~

除另有声明外,本博客文章均采用 知识共享(Creative Commons) 署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 进行许可。