我应该在模型中设置db对象的位置? (MVC)

时间:2009-05-07 19:55:49

标签: php model-view-controller oop

我想知道用我的模型设置db对象的最佳位置在哪里。

我应该对它进行硬编码,因为我的模型应该是为一个项目设计的,所以我将它设置在我的构造函数内或无论我在哪里进行初始化? 要么 在实例化我的对象时,我应该将db对象传递给构造函数吗?

最好的方法是什么,我的意思是来自实验用户,而且效率高,这会让我更加舒适地使用?

3 个答案:

答案 0 :(得分:2)

一些事情:

  1. 大多数利用数据库连接的PHP项目使用Singleton pattern表示该数据库,如果您不确定这是什么,请阅读它。

  2. 通常我在配置文件中定义数据库连接,可以在环境(开发,阶段,生产)之间轻松更改。

  3. 然后,我将使用前面提到的Singleton模式和配置文件在引导程序文件中实例化我的数据库连接。

  4. 我的模型通常会完全抽象数据库/表数据存储,对于每个模型,我会做这样的事情:

  5. bootstrap.php中     

    $config = load_config_data(ENVIRONMENT);
    
    Db::setDefaultAdapter($config['database']);
    

    型号/表/ user.php的     

    class Table_User extends Db_Table 
    {
      // Table name
      protected $_name = 'user';
    
      /* Do a bunch of database specific stuff */
    }
    

    型号/ user.php的

    class User extends Model 
    {
      public function updateUsername($userid, $username)
      {
        // Uses default adapter, Singleton pattern!
        $table = Db::loadTable('user');
        $table->update(
          array('username'=>$username),
          Db::quoteInto('userid = ?', $userid)
        );
      }
    }
    

    这几乎是对ModelZend Framework MVC的介绍,我会检查一下如何组织代码的一些想法(或者省去一些麻烦并实际使用{{} 3}}。)

答案 1 :(得分:1)

为了测试性,您应该将它传递给构造函数而不是硬编码。这有助于您编写单元测试,因为您可以模拟数据库对象。

答案 2 :(得分:0)

我不会硬编码,即使代码从未用于另一个项目,只是从测试数据库移动到实时数据库可能需要定位和更改模型类中的代码。在某种配置文件中,这样做会好得多。

就个人而言,我会在您用作引导程序的任何内容中定义db对象 - 然后让模型使用该单个对象。