正在更新实体


Updating an entity

我现在使用DDD是为了安静一段时间,它花了一些时间来适应和分离一切。但现在我一直在更新我的实体。。。

设置

现在我有一个回购接口,它定义了以下方法

/**
 * @param AccountEntity $account
 * @return AccountEntity
 */
public function create(AccountEntity $account);
/**
 * @param AccountEntity $account
 * @return mixed
 */
public function update(AccountEntity $account);

我的repo在函数中正好执行0,因为它将它传递给映射器,映射器反过来创建/更新数据。到目前为止还不错。

应用程序服务具有接受数组的方法create,该数组将被验证,如果有效,它将使用EntityBuilder来创建实体。(实体需要__construct提供的数据)。如果数据无效,它将引发异常。

现在我的问题是如何在应用程序服务中处理我的更新。

我在更新中得到了一个数据数组,就像创建一样,还有一个实体的id。

  1. 我应该使用hydrator在数组上循环并更新实体中的字段,然后将其扔到我的repo中吗。
    • 缺点是,我有一个实体水合器和构建器
    • 专业人士,它很容易使用
  2. 我应该只验证数据并将数组+id扔给repo,让他知道该怎么做吗
    • 缺点,只是看起来不对
    • 专业人士,再次易于制作
  3. 如果我在实体上执行toArray或类似操作,请将其与表单数据合并;然后使用实体生成器再次构建实体,然后将实体抛出到repo
    • 缺点是,不要认为实体应该有toArray函数
    • 专业人士,听起来像是将构建实体的任务封装在一个地方,所以这似乎是正确的

简而言之,如何将带有数据的数组转换为实体,或者如何保存它。我没有以任何方式使用Doctrine,也没有计划

首先,您的输入数据(数组)应该在控制器级别的某个地方进行验证,以确保格式正确(我们谈论的不是业务规则,只是格式化)。

然后你的实体可以有类似于的东西

 class MyEntity
 {
 public function update($data)
 {
     //update properties, enforce the relevant business rules
   //perhaps events are generated
 }
 }

控制器可能会使用服务方法来进行更新。该服务将向存储库请求实体,最终创建实体所需的输入格式(如果存在差异),然后调用update方法。

然后将实体发送到负责持久化的存储库。请记住,存储库是用来保存/还原实体的,而不是用来更改它们。

这可能是一条注释,但需要50个代表…

您应该看看这篇关于数据映射器的文章:http://www.sitepoint.com/integrating-the-data-mappers/

我正处于你的处境,那位作家(Alejandro Gervasio)的文章对我帮助很大。