さて、私は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();
}
}
- それは「エンティティ」を管理するための正しいアプローチですか?
- そのようなパターンに従って、永続性をどこで処理する必要がありますか?
つまり、私が正しい場合、リポジトリは基本的にコレクションのようなものであるためadd(Entity $e)
、remove(Entity $e)
メソッドを提供する必要がありますが、実際にはどこにエンティティを永続化するのですか?
add()
&remove()
メソッド内でそれを行うのは安全ですか?save()
更新を処理するメソッドを追加する方が良いですか?
お時間をいただきありがとうございます。