为什么Symfony文档建议在我的域用户实体上实现UserInterface接口?
https://symfony.com/doc/3.4/security/entity_provider.html
class User implements UserInterface, \Serializable {}
在我看来,这似乎打破了基本的DDD方法,因为我的域实体从不应该依赖驻留在域外部的某种东西(在这种情况下,UserInterface是Symfony组件)。
问题在于Symfony的UserPasswordEncoder
需要UserInterface
对象才能从用户那里检索盐/密码。
目前,我有一个非常粗略的解决方案,它根本不是防弹/可扩展的,所以我正在寻找解决方案。
我是否需要实现可以直接在我的域用户实体上工作的UserPasswordEncoder?
答案 0 :(得分:1)
在我看来,这似乎打破了基本的DDD方法,因为我的域实体从不应该依赖驻留在域外部的某种东西(在这种情况下,UserInterface是Symfony组件)。
从理论上讲,您是正确的。您的聚合不应以任何方式依赖于基础架构。
许多框架专注于实现软件的快速交付,而不是干净的代码。从中可以看出,Symfony在简单域中更适合CRUD实体,而不是在DDD更适合的复杂域中。这意味着也许您不应该在此域中使用DDD,并且CRUD实体就足够了。
或者也许,如果您认为User
确实是DDD聚合,因为它具有复杂的行为,那么您应该将UserPassword
提取到其自己的CRUD实体中,这不受DDD限制。然后,在您的User
汇总中,您仅通过ID即private $passwordId;
来引用密码。
我是否需要实现自己的UserPasswordEncoder,它可以直接在我的域用户实体上工作?
我认为,至少从DDD的角度来看,这与框架的组件是相同的。密码散列是基础结构组件,无论是谁实施。