我有一个简单的问题。我正在使用Zend Framework 1,我正在使用Data Mapper。这是我的代码:
<?php
// application/model/Pos.php
class Application_Model_Pos extends Zend_Db_Table_Abstract
{
protected $_name = 'pos';
}
// application/model/MapperAbstract.php
abstract class Application_Model_MapperAbstract
{
private $_dbTable;
public function __construct(Zend_Db_Table_Abstract $dbTable)
{
$this->_dbTable = $dbTable;
}
public function findById($id)
{
$select = $this->_dbTable()->select()->where('id = ?', $id)->limit(1);
$row = $this->_dbTable()->fetchAll($select)->toArray();
if(!empty($row))
{
$this->_createEntity($row);
}
}
protected function _createEntity(array $row);
}
// application/model/PosMapper.php
class Application_Model_PosMapper extends Application_Model_MapperAbstract
{
public function __construct()
{
parent::__construct(new Application_Model_Pos());
}
protected function _createEntity(array $row)
{
return new Sb_Pos($row['name']);
}
// application/library/Sb/Pos.php
class Sb_Pos
{
public function __construct($name)
{
$this->_name = $name;
}
}
?>
在您的脑海中使用此代码,我应该在哪里处理表依赖项?映射器应该知道另一个映射器吗?我需要服务层吗?
感谢您的帮助。
答案 0 :(得分:2)
您好,很有疑问。我最近刚刚在MidwestPHP 2013上做了一个关于这个确切主题的演示 - 幻灯片是here(好的 - 抱歉自我推销!)
基本上,对您的问题的简短回答是我认为需要服务层。处理具有多种方式进行填充和映射的对象时,该服务将所有映射器一起绘制。请记住,映射器可以填充全部或部分数据对象......但它不能“跳转”数据源。因此,如果您的特定对象需要多个数据源来获取其数据,则必须将该对象从mapper传递给mapper。
另一种选择 - 假设您刚刚在ZF中使用数据库 - 将获得基本数据库连接,忽略您的表数据访问对象依赖关系,并构建复杂的连接以检索所有数据。有些人不同意这一点 - 但它是一个非常滑的斜率:在什么时候你开始忽略这些单独的表并开始组合你的sql(为了性能)。希望这有帮助!