【发布时间】:2009-05-07 19:55:48
【问题描述】:
我想知道用我的模型设置数据库对象的最佳位置在哪里。
我是否应该对其进行硬编码,因为我的模型应该是为一个项目设计的,所以我将它设置在我的构造函数中或我进行初始化的任何地方? 或者 实例化对象时是否应该将 db 对象传递给构造函数?
什么是最好的方法,我的意思是来自实验用户,高效,让我使用起来更舒服?
【问题讨论】:
标签: php model-view-controller oop
我想知道用我的模型设置数据库对象的最佳位置在哪里。
我是否应该对其进行硬编码,因为我的模型应该是为一个项目设计的,所以我将它设置在我的构造函数中或我进行初始化的任何地方? 或者 实例化对象时是否应该将 db 对象传递给构造函数?
什么是最好的方法,我的意思是来自实验用户,高效,让我使用起来更舒服?
【问题讨论】:
标签: php model-view-controller oop
几件事:
大多数使用数据库连接的 PHP 项目使用 Singleton pattern 表示该数据库,如果您不确定这是什么,请继续阅读。
通常我在配置文件中定义我的数据库连接,可以在环境(开发、阶段、生产)之间轻松更改。
然后,我将使用上述单例模式和配置文件在引导文件中实例化我的数据库连接。
我的模型通常会完全抽象数据库/表数据存储,对于每个模型,我将执行以下操作:
bootstrap.php
$config = load_config_data(ENVIRONMENT);
Db::setDefaultAdapter($config['database']);
模型/表/用户.php
class Table_User extends Db_Table
{
// Table name
protected $_name = 'user';
/* Do a bunch of database specific stuff */
}
模型/用户.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)
);
}
}
这几乎是对Zend Framework MVC 中Model 的介绍,我会查看它以了解有关如何组织代码的一些想法(或者为自己省点麻烦并实际使用framework。)
【讨论】:
为了可测试性,您应该将其传递给构造函数,而不是硬编码。这有助于您编写单元测试,因为您可以模拟您的 DB 对象。
【讨论】:
我不会硬编码它,即使代码从未用于另一个项目,只是从测试数据库移动到实时数据库可能需要在模型类中定位和更改代码。放在某种配置文件中会更好。
就个人而言,我会在您用作引导程序的任何内容中定义 db 对象 - 然后让模型使用该单个对象。
【讨论】: