2013-03-02 74 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(爲了表現)。希望這可以幫助!