2010-11-19 2 views
2

도메인 모델을 애플리케이션의 다른 부분에서 재사용하는 방법을 알아 내려고하고 있으며 데이터 매퍼 패턴이 앞으로 나아갈 길이라고 생각합니다. 아래 예제에는 매퍼의 메서드에 직접 액세스하는 메서드가 있습니다.두 개 이상의 데이터 매퍼가 필요한 도메인 객체

class Groups 
{ 
    protected $_groups = array(); 

    public function addGroup($name) 
    { 
     $this->_groups[] = $name; 
    } 

    public function doSomethingGroupy($cakes) 
    { 
     // get all the groups that have cake 
     return $cakeyGroups; 
    } 
} 

... 그리고 그룹 클래스의 메소드와 일치하는 매퍼. 언젠가 나중에 내가 같은 그룹 모델을 사용하지만 다른 쿼리를 사용하여 그룹을 채우기 위해 원하는 경우

class GroupMapper 
{ 
    public function find($id, Groups $group) 
    { 
     // Mappy type things, maybe some sql 
    } 

    public function fetchByNeediness($cuddles, Groups $group) 
    { 
     // More mappy type things 
    } 

    public function save(Groups $groups) 
    { 
     // Saves 
    } 
} 

그러나 나는 다른 매퍼를 사용합니다. 이제

class AngryGroupMapper 
{ 
    public function find($id, Groups $group) 
    { 
     // Something similar but with other tables and joins 
    } 

    public function fetchByRage($anger, Groups $group) 
    { 
     // Something new but only needed here 
    } 

    public function isEditable(Groups $groups) 
    { 
     // Do some querying 
     return $bool; 
    { 
} 

나는 목적은 스키니 컨트롤러입니다 알 - 지방 모델, 그래서 나는 모델에 (말하자면) 매퍼를지도하는 또 다른 모델을 것?

class FatModelRepository 
{ 
    public function getHappyGroups() 
    { 
     $mapper = new GroupMapper(); 
     return $mapper->fetchByNeediness('Puffy Shoes', new Groups()); 
    } 

    public function getSadGroups() 
    { 
     $mapper = new AngryGroupMapper(); 
     return $mapper->fetchByRage('Aghh!', new Groups()); 
    { 

    public function save(Groups $groups) 
    { 
     $mapper = new GroupMapper(); 
     return $mapper->save($groups); 
    { 
} 

답변

4

데이터 모델에는 데이터 매퍼에 대한 지식이 없어야합니다. Groups 클래스/모델에 find 메소드가 없어야하며 매퍼에 액세스 할 수 없어야합니다.

모델에서 매퍼 종속성을 제거하면 문제가 해결됩니다.

참고 : rojoca 당신이이/가져 오기 모델에 직접 방법을 찾을 수 있습니다 야해 말했듯이 Doctrine 2

+0

"그룹"이 "그룹"개체를 포함하는 모음이고 종속 매핑이 필요한 모델 자체 인 경우 어떻게됩니까? 그룹에서 그룹을 분리하고 매퍼를 통해 전달한 다음 컬렉션에 다시 첨부해야합니까? 클라이언트/컨트롤러가 Mappers에 대한 지식이 필요하다는 뜻입니까? – gawpertron

+0

'FatModel'을 저장소라고합니다. 여기에 대한 좋은 설명이 있습니다. http://msdn.microsoft.com/en-us/magazine/dd569757.aspx#id0400058 – rojoca

+0

왜? 귀하의 필요에 맞게 디자인하십시오. 나는 캐시로 repo를 사용하지 않을 것이다. 데이터 맵퍼에 캐시를 두십시오. – rojoca

0

을 확인하십시오. 기술적으로는 매퍼에 대한 참조를 저장하지 않는 모델에 대해서도 옳다. 그러나 덜 복잡한 상황에서는 모델이 당신이 계획하고있는 매퍼의 가장 추상적 인 형태만을 표현할 수있는 한 오케이라고 생각한다. (즉, 어떤 종류의 기본 매퍼 클래스 또는 인터페이스).

사물을 생각하면 매퍼에 메서드를 추가하면됩니다.이 때문에 상속을 사용합니다. 즉, 새로운 기능에 대한 그룹 맵퍼를 확장하십시오. 물론 이것은 매퍼가 모델에 주입 가능해야합니다. 그러나 모델을 매퍼 (mapper)에 대한 참조로 유지하려고한다면 어쨌든 주사 할 수 있어야합니다.

+0

첫 번째 시도에서 매퍼에 대한 참조를 추가했으며이를 수행하는 한계에 대해 일찍 깨달았습니다. 그러나 모델이나 컨트롤러 없이도 맵퍼를 사용하는 방법을 알 수는 없습니다. – gawpertron

+0

컨트롤러가 응용 프로그램/모듈에 따라 다르기 때문에 매퍼를 사용하여 컨트롤러에 문제가 있다고 생각됩니다. – prodigitalson

+0

매퍼가 다른 매퍼를 알 수 있습니까? – gawpertron