4

さて、私はDDDを紹介しようとしていますが、私はDDDに非常に慣れておらず、いくつかの概念はまだ不明です。

これが私がこれまでに理解したことです:

  • ドメインは基本的にデータに関するものです
  • 永続層はドメインに関連付けられていませんが、ビジネスロジックトランザクションは関連付けられている可能性があります。

Doctrine2を使用する場合、EntityRepositoryまたはCustomEntityRepository実装のいずれかを使用します。

DDDでは、リポジトリのパターンが少し異なっているように見えます。.NETとJavaの例、およびDDDメーリングリストからのメッセージを見てきました。リポジトリはQueryObjectを返す必要があると人々は同意する傾向があります。Doctrine2では、リポジトリからのQueryBuilderインスタンス。

したがって、QueryBuilder、Query、Hydrated結果セットの操作の複雑さを隠すために、Managerと呼ばれる別のサービスレイヤーを実装しました。

私のドメインは次のようになります。

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()更新を処理するメソッドを追加する方が良いですか?

お時間をいただきありがとうございます。

4

1 に答える 1

8

Symfony2 を使用した DDD に関するシリーズを開始しました。これは、あなたの質問に答えるものです: http://williamdurand.fr/2013/08/07/ddd-with-symfony2-folder-structure-and-code-first/

つまり、私が正しければ、リポジトリは基本的にコレクションのようなものです

はい。

したがって、add(Entity $e) および remove(Entity $e) メソッドを提供する必要があります。

はい。

しかし、実際にエンティティを永続化する場所はどこですか?

このリポジトリで。ただし、これはおそらくDoctrine リポジトリではありません。Doctrine はエンティティ/リポジトリの用語を使用しますが、DDD では同じ意味を持ちません。

于 2013-08-13T12:32:12.607 に答える