我正在使用 Doctrine 开发 Symfony 项目,我想将数据库映射与域模型分开,遵循六边形架构和 DDD 原则。我希望我的域实体独立于 Doctrine 等数据存储技术。
最佳实践是什么:
将领域实体与学说实体分离:将领域实体映射到学说实体并使业务逻辑与数据存储技术分离的推荐方法是什么?
实现存储库:我应该如何在 Symfony 中实现存储库,以在使用 Doctrine 进行 CRUD 操作时遵守 DDD 原则?
这是我要使用的项目结构:
代码示例或最佳实践会非常有帮助。
谢谢!
我决定创建一个中间类来处理 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分离。