나는 비슷한 질문을했다. 뒤로 : Using the Data Mapper Pattern, Should the Entities (Domain Objects) know about the Mapper? 그러나 일반적이었고 나는 Doctrine2와 함께 몇 가지 작업을 수행하는 방법에 특히 흥미가있다..Doctrine2 모범 사례, 기업은 서비스를 사용해야합니까?
여기 간단한 예제 모델의 각 Thing
는 User
에서 Vote
을 가질 수하는 User
개 이상의 Vote
하지만 마지막 Vote
수를 주조 할 수있다. 다른 데이터 (Msssage
등)가 Vote
과 관련되어 있기 때문에 두 번째 Vote
이 삽입되면 원래 Vote
은 업데이트 할 수 없으므로 교체해야합니다.
public function setThing(Model_Thing $thing)
{
$this->thing = $thing;
$thing->votes[] = $this;
}
User
을 보장하는 유일한 계산 마지막 Vote
이 뭔가가 나에게 보인다
public function addVote($vote)
{
$vote->entity = $this;
}
그리고 Vote
이 관계를 설정을 담당 : 현재
Thing
이 기능이 Thing
은 보장해야하며 not some service layer입니다.
public function addVote($vote)
{
foreach($this->votes as $v){
if($v->user === $vote->user){
//remove vote
}
}
$vote->entity = $this;
}
그래서 어떻게 도메인 모델 내에서 Vote
을 제거합니까 :
그래서, 모델의 새로운 Thing
기능을 그 유지?NULL
을 수락하기 위해 Vote::setThing()
을 풀어야합니까? Thing
이 투표를 제거하는 데 사용할 수있는 서비스 계층을 사용해야합니까? 투표가 누적되기 시작하면 foreach
은 느려질 것입니다. Thing
을 사용하여 전체 컬렉션을로드 할 필요없이 Vote
을 검색 할 수있게해야합니까?
가벼운 서비스 레이어를 사용하는 것이 분명합니다. 그러나 은 Doctrine2에서 이런 유형의 것을 처리하는 더 좋은 방법입니까, 아니면 올바른 방향으로 가고 있습니까?
링크를 체크 아웃합니다. 서비스 레이어를 모델의 일부로 간주 할 수 있다는 데 동의합니다. 파울러 (Fowler)는 자신의 빈혈 도메인 모델 (Alemic Domain Model) 게시물에서도 동일하게 말합니다. 엔티티가 내부 투표를 추가하는 것을 (현재) 선호하는 반면, 컬렉션을 통해 미친 검색 대신 투표를 찾거나 삭제하기 위해 서비스 레이어에 프록시를 지정합니다. 나는 그 질문이 - 서비스 객체를 주입하는 방법이라고 생각한다. 아마도'$ em-> getRepository()'와 같은 정적 함수일까요? –
그 프레젠테이션을 진행할 기회가 있습니다. 정말 좋은 정보입니다. Zend Framework 아키텍처를 생각 나게합니다. heaver 서비스 레이어가 단위 테스팅의 용이성에 영향을 미칠 수있는 방법을 여전히 처리합니다. 다시 말하지만, 훌륭한 링크. –
당신이 여기에 접근하는 데 관심이 있습니다. 또한 서비스를 내 엔터티의 속성으로 사용하고 엔터티 자체 (지속성을 처리하기 위해 서비스를 사용함)에 '저장'과 같은 메서드를 구현하는 아이디어를 가지고 놀고 있습니다. 이것은 조금 activeRecord (ish) 인 것 같습니다. 그래서 그것을하지 않았습니다. 대안은 서비스 객체를 사용하지만 엔티티를 INTO 대신 전달합니다. – calumbrodie