3

글쎄, 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(); 
    } 
} 
  1. 은 "실체"를 관리하기위한 올바른 접근 방식을?
  2. 이러한 패턴을 따르면 지속성을 어디에 처리해야합니까?

은 내가 맞다 경우, 저장소는 따라서는 add(Entity $e)remove(Entity $e) 방법을 제공해야 모음처럼 기본적이지만, 어디 실제로 엔티티를 지속 할 뜻?

add() & remove() 개의 방법으로 안전하게 수행 할 수 있습니까? 업데이트를 처리하기 위해 save() 메서드를 추가하는 것이 더 좋습니까?

감사합니다.

+0

매니저에서'findOneById' 만하고 싶다면 다음과 같이하면됩니다 :'$ this-> repository-> find ($ id)'(참조하는'id'가 기본 키라고 가정하십시오.). –

+0

@ ColinMorelli, 나도 알아, 예를 위해서였다. 그것은 DDD에 관한 것이 아닙니다.) – Trent

+0

@Trent 저는 현재 비슷한 구조를 가지고 있습니다 : 저장소는 어쨌든 읽기만하고, 저장소의 관리자에게도 전달합니다 (관리자는 중앙 지점이 아닙니다). manager 객체는 주로 엔티티의 지속성과 관련된 로직을 처리하며, 여기에는 엔티티와 관련된 모든 비즈니스 로직 주변 변경 사항 및 이벤트가 포함됩니다. 관리자로부터 리포지토리로의 프록시 호출을 피할 수 있습니다. 장기적으로는 불쾌하고 귀찮습니다. 가져 오기 중에 실제로 일부 논리를 처리해야하는 경우 리스너/이벤트를 통해 저장소에 관리자를 바인딩하십시오. – Ocramius

답변

8

Symfony2로 DDD에 관한 일련의 작업을 시작했습니다. 귀하의 질문에 대답해야합니다 : http://williamdurand.fr/2013/08/07/ddd-with-symfony2-folder-structure-and-code-first/.

은 내가 맞다 경우, 저장소는 수집

예처럼 기본적으로, 의미한다.

따라서는 추가 (법인 $ 전자)를 제공하고 (엔티티 $ 전자) 방법

을 제거해야합니다.

실제로 엔티티를 유지합니까?

이 저장소에 있습니다. 그러나 이것은 아마도 이 아니라 Doctrine 저장소입니다. Doctrine은 엔티티/저장소 용어를 사용하지만 DDD에서 동일한 의미를 갖지 않습니다.

+0

doctrine의 저장소가 Entity Framework의 DbSet과 비슷하다고 생각하십니까? –

+0

symfony에서 지속성을위한 옵션 중 하나 인 doctrine을 사용하여 수행 한 인프라 계층의 구체적인 예가 좋습니다. 나는 데이터베이스에 직접 매핑되는 Doctrine Entities를 사용하는 데 익숙해 졌기 때문에 내가 생각하는 부분을 제외하고는 모두 내 머리 속에서 분명하다고 느낍니다. – vodich

관련 문제