【发布时间】:2017-06-28 15:06:35
【问题描述】:
我正在构建一个小而简单的 PHP 内容管理系统,并选择采用 MVC 设计模式。
我正在努力掌握我的模型应该如何与数据库结合使用。
我想将数据库查询本身分开,这样如果我们将来选择更改我们的数据库引擎,这样做很容易。
作为一个基本概念,下面提出的解决方案是否可行,是否有更好的方法来处理这种方法的缺陷是什么?
首先,我有一个数据库类来处理所有 MySQL 特定的代码:
class Database
{
protected $table_name;
protected $primary_key;
private $db;
public function __construct()
{
$this->db = DatabaseFactory::getFactory()->getConnection();
}
public function query($sql)
{
$query = $this->db->prepare($sql);
$query->execute();
return $query->fetchAll();
}
public function loadSingle($id)
{
$sql = "SELECT * FROM $this->table_name WHERE $this->primary_key = $id";
return $this->query($sql);
}
public function loadAll()
{
$sql = "SELECT * FROM $this->table_name";
return $this->query($sql);
}
}
其次,我有一个模型,在这种情况下可以容纳我的所有菜单项:
class MenuItemModel
{
public $menu_name;
public $menu_url;
private $data;
public function __construct($data)
{
$this->data = $data;
$this->menu_name = $data['menu_name'];
$this->menu_url = $data['menu_url'];
}
}
最后,我将有一个“工厂”将两者结合在一起:
class MenuItemModelFactory extends Database
{
public function __construct() {
$this->table_name = 'menus';
$this->primary_key = 'menu_id';
parent::__construct();
}
public function loadById($id)
{
$data = parent::loadSingle($this->table_name, $this->primary_key, $id);
return new MenuItemModel($data);
}
public function loadAll()
{
$list = array();
$data = parent::loadAll();
foreach ($data as $row) {
$list[] = new MenuItemModel($row);
}
return $list;
}
}
【问题讨论】:
标签: php mysql model-view-controller