使域模型免受学说映射的影响并从 ServiceEntityRepository 返回集合

问题描述 投票:0回答:1

我正在使用 Doctrine 开发 Symfony 项目,我想将数据库映射与域模型分开,遵循六边形架构和 DDD 原则。我希望我的域实体独立于 Doctrine 等数据存储技术。

最佳实践是什么:

  1. 将领域实体与学说实体分离:将领域实体映射到学说实体并使业务逻辑与数据存储技术分离的推荐方法是什么?

    • 具体来说,我希望领域模型仅关注 业务逻辑,而应处理到数据库的映射 分别在基础设施层。
  2. 实现存储库:我应该如何在 Symfony 中实现存储库,以在使用 Doctrine 进行 CRUD 操作时遵守 DDD 原则?

    • 此外,我有一个扩展 ServiceEntityRepository 的存储库,默认情况下,像 findAll() 这样的操作会返回一个数组。我正在寻找一种解决方案,使用此扩展类返回 ArrayCollection 而不是数组,而无需重写逻辑或创建自定义反射类。

这是我要使用的项目结构:

  • 源代码
    • 域名
      • 收藏
      • 型号
      • 存储库接口
    • 基础设施
      • 坚持
        • 教义
          • 实体/映射实体
          • 存储库

代码示例或最佳实践会非常有帮助。

谢谢!

php symfony doctrine-orm domain-driven-design hexagonal-architecture
1个回答
0
投票

我决定创建一个中间类来处理 Doctrine 实体和领域模型之间的映射。这是我的处理方法:

final readonly class DoctrineUserBrokerRepository implements UserRepositoryInterface {
public function __construct(private DoctrineUserRepository $doctrineUserRepository): array
{
}

public function findAll(): array
{
    $userEntities = $this->doctrineUserRepository->findAll();

    return array_map([$this, 'convertEntityToModel'], $userEntities);
}

private function convertEntityToModel(UserEntity $userEntity): User
{
    return new User(
        $userEntity->getId(),
        new Email($userEntity->getEmail()),
        $userEntity->getPassword(),
        $userEntity->getRoles()
    );
}

在此解决方案中,DoctrineUserBrokerRepository充当基础设施层(Doctrine)和领域层(User model)之间的桥梁。 findAll() 和 find() 方法与 Doctrine 交互,但返回域模型。转换逻辑封装在convertEntityToModel()方法中,保持领域逻辑与Doctrine分离。

© www.soinside.com 2019 - 2024. All rights reserved.