2013-06-17 1 views
3

내 질문은 @tereško's의 업데이트 섹션과 관련이 있습니다. "Who should handle the conditions in complex queries, the data mapper or the service layer?"아래는 참조 및 편의를위한 코드입니다. 이 코드 ArticleCollection에서 데이터 매퍼가 컬렉션 패턴의 항목을 처리하는 중

$category = new Category; 
$category->setTitle('privacy'); 

$list = new ArticleCollection; 

$list->setCondition($category); 
$list->setDateRange(mktime(0, 0, 0, 12, 9, 2001)); 
// it would make sense, if unset second value for range of dates 
// would default to NOW() in mapper 

$mapper = new ArticleCollectionMapper; 
$mapper->fetch($list); 

foreach ($list as $article) 
{ 
    $article->setFlag(Article::STATUS_REMOVED); 
} 

$mapper->store($list); 

가 도메인 개체의 모음입니다,의는 Article의 그들에게 전화 할 수 있습니다. ArticleCollectionMapper이 데이터베이스의 데이터를 가져 와서 $list에 할당하는 순간에 각 행에 대해 Article의 인스턴스를 만들어야합니다. 공장 인스턴스 객체 ArticleFactory과 같이 Article의 인스턴스를 $list->addArticle($newArticle)과 같은 메소드를 통해 컬렉션 인스턴스 ( $list)에 추가 할 예정입니까, 아니면 내가 고려하지 않은 다른 옵션이 있습니까?

답변

2

실제로 팩토리 객체를 사용하여 기사를 추가한다고 생각하지 않습니다. 두 번째 예제에서 Article의 인스턴스를 만들 때 자신을 사용하는 것을 볼 수 있습니다. 앞서 진행 한 작업은 ArticleCollection 인스턴스에 addArticles() 메서드를 추가하는 것입니다. 이 방법을 사용하면 매퍼에서 ArticleCollection 인스턴스의 메서드를 호출 할 수 있습니다. ArticleCollectionMapper는 같을 수

class ArticleCollectionMapper extends DataMapperAbstract 
{ 
    public function fetch (ArticleCollection $articles) 
    { 
     $prepare = $this->connection->prepare("SELECT ..."); 
     $prepare->execute(); 
     // filter conditions 

     $articles->addArticles($prepare->fetchAll()); 
    } 
} 
당신은 위의 코드 조각에서 제외됩니다 ArticleCollection 인스턴스에서 조건을 얻어서 몇 가지 필터링을 할 필요가 것

. 또한 사용자의 필요에 따라서 addArticle() 방법을 추가 할 다음 바로 addArticle()를 호출와 위의 foreach 내에서 무엇을 교체 할 수

class ArticleCollection extends DomainObjectAbstract 
{ 
    protected $collection = array(); 

    public function addArticles (Array $articles) 
    { 
     foreach ($articles as $article) 
     { 
      $articleCollectionItem = new Article; 
      $articleCollectionItem->setParams($article); 
      // however you prefer filling your list with `Article` instances 

      $this->collection[] = $articleCollectionItem; 
     } 
    } 
} 

: 그런 다음 우리의 도메인 객체의 addArticles() 구현은 유사한 다음을 보일 것이다. 위의 예는 극히 단순화되어 있으며 코드는을 표준에 맞게 조정해야합니다.

+0

안녕하세요, 제레미, 답변 해 주셔서 감사합니다. 사실 나는 비슷한 솔루션을 사용했다. 오히려 당신이 보여준 addArticle을 사용하여 ArticleCollection에 newArticle과 addArticle 메서드가 있습니다. 첫 번째 것은 datama가 자신의 메서드로 채운 article 객체를 반환합니다. addArticle 메서드는 주어진 기사 개체를 목록에 추가하기 만합니다. 그래서 당신은 맞습니다. 공장을 필요로하지 않습니다. –

관련 문제