2009-10-19 3 views
0

우리의 현재 ORM 솔루션은 데이터 맵퍼를 사용하여 데이터베이스의 테이블/뷰를 표현한 다음 검색된 레코드를 모델 객체로 반복하는 데 사용할 수있는 Collection 객체를 반환합니다. 데이터 매퍼와 모델 레이어 사이에는 데이터 맵퍼에 대한 도메인 요청을 처리하고 해당 컬렉션 또는 도메인 객체를 반환하는 저장소 레이어가 있습니다.클래스 메서드의 올바른 사용법을 올바르게 적용하는 방법?

우리는 현재 리포지토리 및 데이터 매퍼 계층의 책임을 리팩터링하여 데이터 매퍼 계층에 대한 모든 응용 프로그램 요청이 리포지토리를 통해 라우팅되고 데이터 매핑자가 검색된 데이터 행을 리포지토리로 반환 한 다음 리포지토리를 반환합니다. 요청 객체에 대한 필요한 콜렉션.

궁금한 점은 전체 Repository 객체를 해당 Data Mapper로 전달하여 Repository 레이어를 통해서만 Data Mappers에 액세스 할 수 있는지 여부입니다. 나는이 같은 일을 생각

class DataMapper { 

public function findAll(Criteria $criteria) 
{ 
    $select = $criteria->getSelect(); 

    // Build specific select statement 

    $rows = $this->_fetchAll($select); 

    return new Collection(array('data' => $rows, 'mapper' => get_class($this))); 
} 
} 

:이 버전에서 다음

class Repository { 

public function findAllByName(Model $model) 
{ 
    $this->_criteria->addCondition('name LIKE ?', $model->name); 

    $rows = $this->_mapper->findAll($this); 

    return new Collection(array('data' => $rows, 'repository' => get_class($this))); 
} 

} 

class DataMapper { 

public function findAll(Repository $repository) 
{ 
    $select = $repository->getCriteria()->getSelect(); 

    // Build specific select statement 

    $rows = $this->_fetchAll($select); 

    return $rows; 
} 
} 

와, 컬렉션 객체가 호출을 발행 할 지금 어떻게 작동하는지

는 예를 들어이 기본적으로 캐시 된 객체를 먼저 검색 한 다음 데이터베이스에 대한 호출 만 실행하여 필요할 경우 레코드를로드 할 수있는 저장소에 저장합니다.

답변

1

크리스가 유효한 제안이 같은 것을 볼 수 있었다.

그것은 부분적으로 코드의 상황에 따라 다르지만 종속성가 만든 DataMapper 인스턴스, 즉에 저장소를 주입 :

$repo = new Repository(); 

$mapper = new DataMapper($repo); 

이후 필요할 때마다 주위에 그 $의 REPO를 전달하는 데에서 당신을 여분의 것 findAll()을 사용합니다. IE는 :

$mapper->findAll(); 
$mapper->findAllByName(); 

매개 변수 내가 만들고있어 모든 함수 호출의 유비쿼터스 일부가 될 때 발견, 그것은 (그들이 때마다 동일한있어 특히) 인스턴스 변수로 선회 고려해야 할 의미가 있습니다.

저장소가 컨텍스트/인스턴스 간 차이가 나는 경우 주입이 더 적합합니다. 하나의 Repo 인스턴스를 항상 생성하고 재활용하려는 경우 싱글 톤이 적합 할 수 있습니다.

의존성 주입에 대한 좋은 점은이 종속성 아이디어 (아이러니하게!)를 분명히 해줍니다. 이를 적용하려면 __construct() 메서드에서 $ repo 객체가 null이거나 Repository 인스턴스가 아닌 경우 예외를 발생시키는 등의 작업을 수행 할 수 있습니다.

1

나는이 작업을 약간 다르게 할 것입니다. 나는 setRepository (Repository $ repos) 메소드와 getRepository() 메소드를 추가 할 것이다. 그런 다음 findAll 메소드에서 getRepository()를 호출하십시오. setRepository()가 아직 호출되지 않은 경우 getRepository는 기본 저장소 인스턴스를 리턴 할 수 있습니다.

Repository의 여러 구현을 DataMapper 클래스 내에서 사용할 수 있도록 Repository 클래스 용 인터페이스를 만들 수도 있습니다.

그래서 get 메소드는

public function getRepository() 
{ 
    if (!$this->_repository) { 
     $this->_repository = new Repository(); 
    } 

    return $this->_repository; 
} 

같은 것을 볼 수 있었다 및 설정 방법은

public function setRepository(RepositoryInterface $repos) 
{ 
    $this->_repository = $repos; 
} 
관련 문제