【发布时间】:2012-03-01 22:27:19
【问题描述】:
这是我的问题,我构建了一个很小的 PHP MVC 框架。 现在当我在控制器中时,我应该能够加载模型。 我有命名为数据库表的模型,如 Users.php、Pages.php 等。
所有控制器都扩展了BaseController,所有模型都扩展了BaseModel,这样我就可以有一些方法可用于所有控制器。就像从任何控制器一样,我可以像这样使用 loadModel 方法:
$usersModel = $this->loadModel("Users");
现在 $usersModel 将是代表用户数据库表的对象,我应该从那里打开数据库连接,并从用户表中获取、更新、删除内容。
要从我的模型中获取数据库连接,baseModel 有方法 loadDatabase(),我像这样使用它:
$database = $this->loadDatabase();
这将返回在 PDO 周围薄层的类,因此我可以从那里使用这样的东西:
$data = $database->fetchAssoc("SELECT * FROM users WHERE name = ?", array("someone"));
这就是我将一些 $data 从模型返回到控制器的方式。
因此,基本上,Controller 可以加载模型,然后调用该模型上的方法,这些方法将返回一些数据或更新或删除等。
现在,Controller 可以加载多个模型。每个模型都应该加载数据库,这就是它变得复杂的地方。我只需要一个与数据库的连接。
这是 loadDatabase 方法的外观:
public function loadDatabase()
{
// Get database configuration
require_once("Application/Config/Database.php");
// Build configuration the way Database Object expects it
$dns = "{$db_config['db_driver']}:host={$db_config['db_host']};dbname={$db_config['db_name']}";
$username = $db_config['db_user'];
$password = $db_config['db_pass'];
$options = $db_config['db_options'];
// Return new Database object
return new \Core\Database\Database($dns, $username, $password, $options);
}
所以在加载数据库对象之前,我必须加载数据库连接的配置,因为数据库对象 __constructor 期望它。然后我实例化新的数据库对象并返回它。
现在我卡住了,我不知道这是从模型加载数据库的正确方法吗? 我应该如何设置它,我应该如何从模型内部加载数据库,以便始终只有一个数据库对象实例。因为如果我从控制器做这样的事情:
$users = $this->loadModel("Users");
$pages = $this->loadModel("Pages");
$users->doSomethingThatNeedsDatabase();
$users->doSomethingThatNeedsDatabase();
$pages->doSomethingThatNeedsDatabase();
我会创建 3 个数据库对象 :(
所以我的问题是,我应该如何从模型内部加载数据库,以及该方法在 BaseModel 中的外观应该如何? 如果我想使用 2 个数据库,我会遇到一些大问题。 如何在不使用单例模式的情况下实现这一目标?
目前,我也有这样的:
public function getDatabase()
{
$reg = \Core\Registry\Registry::getInstance();
$db = $reg->getObject("database");
if(!isset($db))
{
require_once("Application/Config/Database.php");
$dns = "{$db_config['db_driver']}:host={$db_config['db_host']};dbname={$db_config['db_name']}";
$username = $db_config['db_user'];
$password = $db_config['db_pass'];
$options = $db_config['db_options'];
$db = new \Core\Database\Database($dns, $username, $password, $options);
$reg->setObject('database', $db);
}
return $reg->getObject('database');
}
这是注册表模式,我可以在其中保存共享对象。因此,当模型要求数据库连接时,我可以检查数据库类是否在注册表中,然后返回它,如果没有,我会启动然后返回......最令人困惑的是我需要加载配置数组......
那么从模型加载数据库的最佳方法是什么?
感谢阅读,这是一个很长的问题,但这让我很困扰,我希望有人能帮助我解决这个问题...谢谢!
【问题讨论】:
-
您可以在代码开始时配置和初始化数据库对象,然后将其插入注册表并在模型中从注册表中提取它。
$db = new DB($config); Registry::set('___DB__', $db);
标签: php database model-view-controller