2013-03-02 104 views
2

我有一个简单的问题。我正在使用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

我想指向你http://www.survivethedeepend.com,第9章关于使用mappers进行lazyloading。但在这个特定的网站似乎是下降。 – 2013-03-02 19:59:02

回答

2

你好,很好的问题。我刚刚在MidwestPHP 2013做了关于这个确切主题的演示文稿 - 幻灯片是here(好的 - 对此自我推销感到抱歉!)

基本上,您的问题的简短答案是,我相信服务层是必需的。当使用具有多种方式获取填充和映射的对象时,该服务将所有映射器绘制在一起。请记住,映射器可以填充全部或部分数据对象......但它不能“跳转”数据源。因此,如果您的特定对象需要多个数据源来获取其数据,则必须将该对象从映射器传递给映射器。

另一种方法 - 假设您只是在ZF中使用数据库 - 将获得基本数据库连接,忽略您的表数据访问对象依赖关系,并构建复杂连接以检索所有数据。有些人会不同意这一点 - 但它是一个非常滑的倾向:在什么时候你开始忽略这些单独的表并开始组合你的sql(为了表现)。希望这可以帮助!