gpt4 book ai didi

php - 如何在 Symfony2 项目中使用 Doctrine2 实现 DDD?

转载 作者:可可西里 更新时间:2023-11-01 00:15:01 24 4
gpt4 key购买 nike

好吧,我正在尝试向 DDD 介绍自己,我对它很陌生,有些概念仍然不清楚。

这是我目前的理解:

  • 领域基本上是关于数据的
  • 持久层不绑定(bind)到域,但业务逻辑事务可能绑定(bind)。

在使用 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();
}
}
  1. 这是管理“实体”的正确方法吗?
  2. 按照这种模式,我必须在哪里处理持久性?

我的意思是,如果我是对的,存储库基本上就像一个集合,因此它应该提供 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/ .

I mean, if I'm right, the repository is basically like a collection

是的。

therefore it should provide add(Entity $e) and remove(Entity $e) methods

是的。

but where do I actually persist the entity?

在此存储库中。但是,这可能不是 Doctrine 存储库。 Doctrine 使用 Entity/Repository 术语,但它们在 DDD 中的含义不同。

关于php - 如何在 Symfony2 项目中使用 Doctrine2 实现 DDD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14855124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com