글쎄, DDD에 자신을 소개하려고하는데, 나는 그것에 대해 아주 익숙하고 몇몇 개념은 여전히 불분명하다. 여기Symfony2 프로젝트 내에서 Doctrine2로 DDD를 구현하는 방법은 무엇입니까?
는 지금까지 이해 것입니다 :
- 도메인은 데이터
- 지속성 층이 도메인에 연결되지 않고 비즈니스 로직의 트랜잭션이있을 수 있습니다에 대해 기본적으로.
Doctrine2를 사용할 때 우리는 EntityRepository 또는 CustomEntityRepository 구현을 사용합니다.
DDD에서 저장소 패턴은 약간 다르게 보입니다. NET & Java 예제와 DDD 메일 링리스트의 메시지를 살펴본 결과 사람들은 저장소가 QueryObject를 Doctrine2에 반환해야한다는 데 동의하는 경향이 있습니다. 내 저장소에서 QueryBuilder 인스턴스를 반환하는 프로젝트입니다.
따라서 QueryBuilder로 작업하는 복잡성을 숨기고 쿼리에서 수화 결과 집합을 숨기려면 관리자라고하는 다른 서비스 계층을 구현했습니다. 여기
내 도메인과 같은 모습입니다 :
src/Domain/
├── Entity
│ ├── AbstractComment.php
│ ├── Comment.php
├── Manager
│ ├── CommentManager.php
└── Repository
└── CommentRepository.php
엔터티 폴더는 순수한 POPO에 관한 것입니다.
CommentRepository
<?php
namespace Acme\Domain\Repository;
use Doctrine\Common\Collections\Criteria;
class CommentRepository
{
private $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
/**
* @param $id
*
* @return \Doctrine\ORM\QueryBuilder
*/
public function findOneById($id)
{
$qb = $this->getEntityManager()
->getRepository('Acme:Domain\Entity\Comment')
->createQueryBuilder('c');
$criteria = new Criteria();
$criteria->andWhere(
$criteria->expr()->eq('c.id', ':id')
);
$qb->addCriteria($criteria);
$qb->setParameter('id', $id);
return $qb;
}
}
그리고 CommentManager
:
<?php
namespace Acme\Domain\Manager;
class CommentManager
{
protected $repository;
public function __construct(CommentRepository $repository)
{
$this->repository = $repository;
}
public function findOneById($id)
{
return $this->repository->findOneById($id)->getQuery()->getOneOrNullResult();
}
}
- 은 "실체"를 관리하기위한 올바른 접근 방식을?
- 이러한 패턴을 따르면 지속성을 어디에 처리해야합니까?
은 내가 맞다 경우, 저장소는 따라서는 add(Entity $e)
및 remove(Entity $e)
방법을 제공해야 모음처럼 기본적이지만, 어디 실제로 엔티티를 지속 할 뜻?
add()
& remove()
개의 방법으로 안전하게 수행 할 수 있습니까? 업데이트를 처리하기 위해 save()
메서드를 추가하는 것이 더 좋습니까?
감사합니다.
매니저에서'findOneById' 만하고 싶다면 다음과 같이하면됩니다 :'$ this-> repository-> find ($ id)'(참조하는'id'가 기본 키라고 가정하십시오.). –
@ ColinMorelli, 나도 알아, 예를 위해서였다. 그것은 DDD에 관한 것이 아닙니다.) – Trent
@Trent 저는 현재 비슷한 구조를 가지고 있습니다 : 저장소는 어쨌든 읽기만하고, 저장소의 관리자에게도 전달합니다 (관리자는 중앙 지점이 아닙니다). manager 객체는 주로 엔티티의 지속성과 관련된 로직을 처리하며, 여기에는 엔티티와 관련된 모든 비즈니스 로직 주변 변경 사항 및 이벤트가 포함됩니다. 관리자로부터 리포지토리로의 프록시 호출을 피할 수 있습니다. 장기적으로는 불쾌하고 귀찮습니다. 가져 오기 중에 실제로 일부 논리를 처리해야하는 경우 리스너/이벤트를 통해 저장소에 관리자를 바인딩하십시오. – Ocramius