【问题标题】:DDD and Doctrine mapping inside Entity实体内部的 DDD 和 Doctrine 映射
【发布时间】:2015-10-14 14:01:14
【问题描述】:

我想在领域驱动设计方法中使用 Doctrine 进行数据持久性。但困扰我的是关联映射应该在实体内部。就纯 DDD 而言,这不是一个不好的做法吗?因为在我解决持久性问题之前,我的域实体非常干净,现在它们的属性中有很多 cmets。像这样:

<?php

namespace Domain\Model;

use Doctrine\ORM\Mapping as ORM;

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity
 */
class User
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="SEQUENCE")
     * @ORM\SequenceGenerator(sequenceName="user_id_seq", allocationSize=1, initialValue=1)
     * @ORM\Column(type="integer")
     */
    private $id;  

    ...

除了使用这些 cmets,我还必须拥有 use Doctrine\ORM\Mapping as ORM;。这样一来,基础架构就不会与域分开。

有没有办法将此映射移动到配置文件?我正在使用 ZF2。

【问题讨论】:

  • Doctrine 2 支持 yaml 以及 xml 映射。只需在 ZF2 文档中搜索如何在其框架中执行此操作。我使用的是 Symfony 2,所以我不能给你具体的信息,但我相信它可以做到。
  • 这成功了!感谢您的回答。我对 Zend 使用了这种方法:kerstner.at/en/2014/04/…

标签: php zend-framework2 doctrine domain-driven-design


【解决方案1】:

是的,从 DDD 的角度来看,这很糟糕。有两种解决方案:

  • 使用外部映射机制,例如 @Cerad 所描述的机制。这将域模型从持久性问题中解放出来,但管理起来也可能很痛苦。毕竟,许多项目放弃基于 XML 的持久性配置是有原因的。

  • 创建一个单独的持久性模型。这个模型非常简单,根本不包含逻辑,只包含数据。然后,创建一个映射器在两者之​​间进行映射。

【讨论】:

  • 感谢您的回答。我使用了@Cerad 给出的第一个解决方案。关于第二种解决方案,我应该有 2 个代表用户的实体吗?一个用于域,另一个用于持久性?
  • @RodrigoOtavio 是的,尽管我不会将持久性对象称为实体以避免混淆。
  • Entity 是 Doctrine 使用的名称,但是,是的,通过这种划分,DDD 实体是您的域模型,而 Doctrine 实体将是一种持久性 DTO(只是数据、模式定义注释、没有行为)。 – 将 XML/YAML 用于 Doctrine 模式定义将隐含地强制执行差异,并且不会引起关于有两个代表用户的类/实体的混淆。域在 PHP 类中,而 Doctrine 模式在 XML 中。
【解决方案2】:

洋葱架构可以回答您的问题,并且是推荐的 DDD 架构方法之一。我保留域层的想法仅包含业务逻辑。基础设施层将具有存储库。存储库的工作是持久化在域对象中所做的更改。因此,如果您使用的是 ORM,那么这是您应该维护映射的层。这是great post关于如何在 DDD 中实现 Repository,希望对您有所帮助,

https://codingcraft.wordpress.com/2015/10/12/implementing-repository-in-ddd-part-1/

【讨论】:

    猜你喜欢
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    相关资源
    最近更新 更多