实现Symfony的UserInterface的DDD和用户实体的设计问题

时间:2018-10-12 16:41:37

标签: php symfony domain-driven-design

为什么Symfony文档建议在我的域用户实体上实现UserInterface接口?

https://symfony.com/doc/3.4/security/entity_provider.html

class User implements UserInterface, \Serializable {}

在我看来,这似乎打破了基本的DDD方法,因为我的域实体从不应该依赖驻留在域外部的某种东西(在这种情况下,UserInterface是Symfony组件)。

问题在于Symfony的UserPasswordEncoder需要UserInterface对象才能从用户那里检索盐/密码。

目前,我有一个非常粗略的解决方案,它根本不是防弹/可扩展的,所以我正在寻找解决方案。

我是否需要实现可以直接在我的域用户实体上工作的UserPasswordEncoder?

1 个答案:

答案 0 :(得分:1)

  

在我看来,这似乎打破了基本的DDD方法,因为我的域实体从不应该依赖驻留在域外部的某种东西(在这种情况下,UserInterface是Symfony组件)。

从理论上讲,您是正确的。您的聚合不应以任何方式依赖于基础架构。

许多框架专注于实现软件的快速交付,而不是干净的代码。从中可以看出,Symfony在简单域中更适合CRUD实体,而不是在DDD更适合的复杂域中。这意味着也许您不应该在此域中使用DDD,并且CRUD实体就足够了。

或者也许,如果您认为User确实是DDD聚合,因为它具有复杂的行为,那么您应该将UserPassword提取到其自己的CRUD实体中,这不受DDD限制。然后,在您的User汇总中,您仅通过ID即private $passwordId;来引用密码。

  

我是否需要实现自己的UserPasswordEncoder,它可以直接在我的域用户实体上工作?

我认为,至少从DDD的角度来看,这与框架的组件是相同的。密码散列是基础结构组件,无论是谁实施。