好吧,我正在尝试向 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
Entity 文件夹只是纯粹的 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()
处理更新的方法会更好吗?
感谢您的时间。