2

我有一个小型 php 应用程序,我想在上面构建一个数据库抽象层,上面有一些“模型”类型的类。

我正在使用 ezSQL_mysql 来完成数据库工作。

我的问题是设计应用程序的最佳方式是什么?我应该使用单例模式来共享数据库连接吗?我的“模型”类应该扩展 ezSQL_mysql 吗?或者,也许我完全不在这儿,需要做点别的事情。

我需要的是这样的

控制器.php

   $db = new ezSQL_mysql($db_user, $db_passwd, $db_database, $db_host);


   $user = new User();
   $user->update_email($new_email);

   $sale = new Sale();
   $sale->purchase($amount); 

用户模型.php

class User {

   /* uses $db connection */
   function update_email(){
     /* do something */
   };
}

sale_model.php

class Sale {   
   /* uses $db connection*/

   function purchase () {
    /* do something */ 
   }
}
4

3 回答 3

3

数据库连接单例可能有问题。幸运的是,连接共享不是必需的。您可以有一个连接管理器类,当给定以前使用的主机、用户和数据库名称时,它会返回已经打开的连接。

abstract class ConnectionManager {
    protected $connections = array();
    function connect($host, $db, $user, $pw) {
        if (! isset($this->connections[$host][$db][$user])) {
            $this->connections[$host][$db][$user] = $this->newConnection($host, $db, $user, $pw));
        }
    }
    abstract protected function newConnection($host, $db, $user, $pw);
}

class EzSQLConnectionManager extends ConnectionManager {
    protected function newConnection($host, $db, $user, $pw) {
        return new ezSQL_mysql($user, $passwd, $database, $host);
    }
}

此处未解决的是如何安全地存储用户凭据。密码不应随意散布在整个脚本中,这种方法可能会导致您这样做。

于 2011-02-21T22:16:25.170 回答
2

对于小型应用程序,绝对使用域对象模式。也就是说,每个对象都代表 db 实体。

然后,您可以决定是否使用映射器模式向数据库添加一些更复杂的查找。

如果您更喜欢经过测试的解决方案,您可以查看 Zend_Db。它涵盖了您需要的一切,从 db 适配器、工厂等。它基本上实现了网关模式,但是参考手册中已经显示了实现类似 mapper 的东西。

其他解决方案包括 ORM,如 Doctrine 或 Propel。

模式不应该被过度使用。如果它是一个小应用程序,请尽可能简单地解决问题。如果您将其作为实验进行,请尝试使用 Doctrine。这些库有时会非常惊人。

于 2011-02-21T22:08:43.727 回答
0

好的......所以小应用程序的需求像往常一样增长,我决定使用 MVC 框架,而不是滚动我自己的松散类集来管理持久连接和抽象数据库层。

所以现在我正在使用 CodeIgniter http://www.codeigniter.com/它基本上以更容易管理的方式完成了我想做的事情。

感谢其他答案。

于 2011-02-23T01:11:05.860 回答