在哪里建立新的域名实体?控制器,存储库或映射器?

joh*_*ack 7 php instantiation separation-of-concerns

假设对于每个域实体,我都有一个为数据映射器提供API的存储库.例如,如果我有一个UserEntity,那么我会有一个UserRepository与UserMapper说话,以便在数据库中保存用户数据.

现在,假设一个表单在网页上提交,我的控制器知道它需要根据提交的信息创建一个新的UserEntity.

可以:

  1. 在那里做新的UserEntity(),并根据提交的表单数据运行所有必要的setter方法,然后将UserEntity传递给repo,后者将传递给mapper进行插入?

    控制器创建UserEntity => Repo => Mapper => DB

  2. 将表单数据转换为数组,并将其传递给UserRepository,然后UserRepository运行新的UserEntity()和setter,并将其传递给mapper进行插入?

    控制器传递用户数据=> Repo创建UserEntity => Mapper => DB

  3. 将数组传递给UserRepository,UserRepository将数组传递给映射器以获取新的UserEntity和插入?

    控制器传递用户数据=> Repo传递用户数据=> Mapper创建UserEntity => DB

谁负责管理对象的创建?

Cra*_*der 1

这是一个很难回答的问题。我的两分钱排在第一有几个原因。首先,假设您的实体中具有域验证,这很可能会拒绝正在传递的数据。如果这种情况发生在 2 或 3 中,那么你在被拒绝之前已经深入了一些对象。就 2/3 和 1 的差异而言,内存或执行时间可能不是很多,但它是一个差异。我尝试快速失败。

其次,我认为控制器了解传入的数据以及对象是完全可以接受的。我同意“胖模型,瘦控制器”的说法,但说控制器无法了解实体会使控制器变得太瘦,不符合我的喜好。