循序渐进编写 PHP 框架 2

循序渐进编写 PHP 框架 2

Chris Yue One comment
Posts

介绍了分工的好处以及引入了 MVC 的概念,可以说开发框架都是围绕分工的思想进行的。接下来我将具体介绍 Model 层的分工,以及一些新的编程思想。

model/article.php 这个文件里面,包含了数据库连接以及数据库获取。假设我们模仿文章列表又做了一个作者列表,我们会发现在 Model 层文件中,数据库连接代码破坏了我们之前说的 DRY 思想,所以理所当然的这一部分代码应该被分到外面去,如库文件 lib/connection.php 里面,这样我们就可以在需要数据库连接的时候引入此文件并调用 createDbh 方法就行了。刚才我所做的事情其实也体现了两个编程思想:不做过多设计,勇于重构。

不做过多设计是面对未知需求来说的。在一个项目的开发周期里面,对程序影响最大的可能就属于未知需求了。有些传统程序员可能会做许多所谓“预留设计”来企图应对未知的需求。就我的经验来说,预留设计的作用很有限,预留设计对程序员的项目经验有很高的要求,而且随着时代的变化,需求也在不断的变化,就算是很有经验的程序员也不见得能在一个项目里面做很准确的预留设计。从另外一个方面来说,有些过度的或者非实用的预留设计在需求的变更周期中,往往从来用不上,反而影响性能,变成了“毒瘤设计”。所以在我看来,预留设计的本质方向就是错误的,我个人是反对做过多的设计,而赞成“刚刚好”。

勇于重构是指在面对新需求,代码可能会出现坏味道(也就是很多国外文章里说的 bad smell),这个时候你可能需要对以前做好的程序做相应的修改,让满足新需求的同时代码也更容易维护,就好像上面把数据库连接部分提出来放到库里那样做一样,万一库改密码了很方便修改。我发现在实际开发中,程序员往往不喜欢重构代码,特别是国内的程序员,喜欢按“怎么方便怎么做”的方式来应付需求的新增与变化,这样做的结果往往是到了后期代码变得特别混乱以至于自己都没法维护。假如面对以下需求变更:之前一个获取人气文章列表的方法,前端 controller 有好多地方都用调用了,后来需求改了说所有获取人气文章列表的地方都改成获取管理员推荐文章列表,你的第一反应是直接把获取人气文章列表方法的代码实现改成获取管理员推荐文章列表呢,还是新写获取管理员推荐文章列表的方法,然后利用编辑器的批量替换功能把 controller 调用的代码都换掉?

回到正题。我们现在多了个需求:文章多一个“是否显示”的属性(字段为 visible,boolean 类型),前台只能查看没有隐藏的文章标题,后台全部都看得到。现在我们要分别做出前后台两个文章显示页面。我们先将 model 文件 article.php 改成如下内容以满足数据获取的需求:

<?php
// /path/to/model/article.php

function createDbh()
{
  return new PDO('mysql:dbname=your_db_name;host=your_db_host', $user, $password);
}

function getVisibleArticles()
{
  $sth = createDbh()->prepare('SELECT id, title, created_at FROM article WHERE visible = 1');
  $sth->execute();
  return $sth->fetchAll(PDO::FETCH_ASSOC);
}

function getAllArticles()
{
  $sth = createDbh()->prepare('SELECT id, title, created_at FROM article');
  $sth->execute();
  return $sth->fetchAll(PDO::FETCH_ASSOC);
}

并同时修改 controller 文件 article-list.php 相应代码使其获得正确的文章数据。

最后仿照之前做的工作创建 controller 文件 backend-article-list.php 以及模版文件 /path/to/template/backend_article_list.php

为了复用获取数据库连接的代码,我们暂时将createDbh函数从 path/to/model/article.php 里提取出来放在 path/to/lib/db.php 里面。这样在添加跟多的 model 文件的时候能够复用,并且可以交给负责数据库连接的人专门维护。

因为发现网上的相关优秀的资源太多,我也是无心再继续写下去。如果真的对自己写框架感兴趣,可阅读《使用Symfony2组件创建自己的PHP框架》系列译文

循序渐进编写 PHP 框架 2 by Chris Yue is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

微信赞赏码

写作累,服务器还越来越贵
求分担,祝愿好人一生平安
天使打赏人

One comment

eirc

六月 6, 2011 在 11:33 下午

good

发表评论

− 7 = 1