我习惯于在我的 dbtable 类中创建我的业务逻辑,但从我读到的内容来看,这是一个糟糕的设计。
我一直在阅读很多关于 zend 框架的模型架构的文章,但我仍然对应该使用哪种方法感到困惑。
根据您的经验,您使用什么方法?(Datamappers 或使用 ORM)(同时考虑快速应用程序开发)
我习惯于在我的 dbtable 类中创建我的业务逻辑,但从我读到的内容来看,这是一个糟糕的设计。
我一直在阅读很多关于 zend 框架的模型架构的文章,但我仍然对应该使用哪种方法感到困惑。
根据您的经验,您使用什么方法?(Datamappers 或使用 ORM)(同时考虑快速应用程序开发)
尝试提供一点帮助,
使用 ZF DbTable 类来保存业务逻辑的原因是这样做违反了“关注点分离”。
通过执行以下操作:
class Application_Model_DbTable_Genre extends Zend_Db_Table_Abstract
{
protected $_name = 'genre';
protected $_primary = 'id';
public function fetchAllGenre()
{
$select = $this->select();
$select->order('name ASC');
$result = $this->fetchAll($select);
return $result;
}
}
您的模型与您的数据库耦合。因此,如果您必须更改数据源,您将不得不重构触及该表的每一段代码。
现在您可以并且应该使用 ZF 提供的 DbTable 模型,但要与数据映射器和域模型一起使用。
//Domain Model
class Video_Model_Genre extends Jgs_Model_Entity_Abstract
{
protected $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
return $this;
}
}
//The mapper
class Video_Model_Mapper_Genre extends Jgs_Model_Mapper_Abstract
{
protected $_tableName = 'genre';
function __construct(Zend_Db_Table_Abstract $tableGateway = null)
{
//Pass in the DbTable Model, This is the database adapter for this mapper.
$tableGateway = new Application_Model_DbTable_Genre();
parent::__construct($tableGateway);
}
//create the domain object
protected function createEntity($row)
{
$data = array(
'id' => $row->id,
'name' => $row->name
);
return new Video_Model_Genre($data);
}
public function saveGenre(Video_Model_Genre $genre)
{
if (!is_null($genre->id)) {
$select = $this->getGateway()->select();
$select->where('id = ?', $genre->id);
$row = $this->getGateway()->fetchRow($select);
} else {
$row = $this->getGateway()->createRow();
}
$row->name = $genre->name;
$row->save();
return $row;
}
}
[注意:] 如果你想查看用于构建这些类的基类/抽象类,Github、Library
使用映射器和域模型真正重要的是域模型不关心数据来自哪里。如果您有多个数据源,您可以为构建相同域模型的每个数据源构建一个映射器。
例如,如果我有一个 XML 文件,其中包含构建“流派”对象所需的所有信息,我可以构建一个使用该 XML 文件作为数据源的映射器,但我仍将使用相同的域模型来构建“流派”对象。
至于使用 ORM。在你知道如何使用它之后,ORM 会很棒。大多数 ORM 的学习曲线非常陡峭。面对现实吧,如果您还不知道和理解如何实现数据映射器模式,那么您可能还没有准备好使用 ORM。我知道我不是(我花了 3 个月的时间才用映射器走到这一步)。