Tre*_*ent 3 php domain-driven-design ddd-repositories symfony doctrine-orm
好吧,我正在尝试将自己介绍给DDD,我对它很新,一些概念仍然不清楚.
这是我到目前为止所理解的:
使用Doctrine2时,我们使用EntityRepository或CustomEntityRepository实现.
在DDD中,Repository模式看起来有点不同,我查看了.NET和Java示例以及来自DDD邮件列表的消息,人们倾向于认为存储库应该返回QueryObject,在Doctrine2中,我项目返回我的存储库中的QueryBuilder实例.
因此,为了隐藏使用QueryBuilder的复杂性,然后查询一个Hydrated结果集,我实现了另一个我叫做Manager的服务层.
以下是我的域名的样子:
src/Domain/
??? Entity
? ??? AbstractComment.php
? ??? Comment.php
??? Manager
? ??? CommentManager.php
??? Repository
??? CommentRepository.php
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
而且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();
}
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,如果我是对的,存储库基本上就像一个集合,因此它应该提供add(Entity $e)和remove(Entity $e)方法,但我在哪里实际持有实体?
在add()&remove()方法中进行是否安全?添加save()方法来处理更新是否更好?
感谢您的时间.
我用Symfony2开始了一个关于DDD的系列,它应该回答你的问题:http://williamdurand.fr/2013/08/07/ddd-with-symfony2-folder-structure-and-code-first/.
我的意思是,如果我是对的,存储库基本上就像一个集合
是.
因此它应该提供add(Entity $ e)和remove(Entity $ e)方法
是.
但我在哪里实际坚持实体?
在这个存储库中.但是,这可能不是 Doctrine存储库.Doctrine使用Entity/Repository术语,但它们在DDD中的含义不同.
| 归档时间: |
|
| 查看次数: |
6069 次 |
| 最近记录: |