2013-03-02 2 views
2

빠른 질문이 있습니다. 젠드 프레임 워크 1을 사용하고 있으며 데이터 매퍼를 사용하고 있습니다. 여기 내 코드는 다음과 같습니다.데이터 매퍼 종속성

<?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

mappers로 lazyloading에 대한 http://www.survivethedeepend.com, 9 장을 알려 드리고 싶습니다. 그러나이 특정 사이트에서 다운 것으로 보인다. –

답변

2

안녕하세요. 방금 MidwestPHP 2013에서 정확한 주제에 대한 프레젠테이션을했습니다. 슬라이드는 here입니다. (ok - 자체 프로모션에 대해 죄송합니다.)

기본적으로 귀하의 질문에 대한 답변은 서비스 레이어가 필요하다고 생각됩니다. 채워지고 맵핑되는 여러 가지 방법이있는 오브젝트로 작업 할 때 서비스는 모든 맵퍼를 함께 그립니다. 매퍼는 데이터 객체 전체 또는 일부를 채울 수 있지만 데이터 소스를 "점프"할 수는 없습니다. 따라서 특정 객체가 데이터를 얻기 위해 여러 데이터 소스를 필요로하는 경우 해당 객체를 매퍼에서 매퍼로 전달해야합니다.

다른 대안 - 여기서 ZF에서 데이터베이스를 사용한다고 가정하면 기본 db 연결을 얻고 테이블 데이터 액세스 개체 종속성을 무시하고 모든 데이터를 검색하기 위해 복잡한 조인을 작성하는 것입니다. 어떤 사람들은 이것에 동의하지 않을 것입니다. 그러나 매우 미끄러운 경사입니다. 어느 시점에서이 개별 테이블을 무시하고 성능 향상을 위해 SQL을 결합하기 시작하십시오. 희망이 도움이!